home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / mpl17ds.zip / RBBS-PC.BAS < prev    next >
BASIC Source File  |  1989-06-12  |  180KB  |  4,910 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS CPC17-1B, Copyright 1988 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR REMOVE LINES 3-29
  4. 9 'by D. Thomas Mack, 39 Cranbury Drive, Trumbull, CT 06611
  5. 10 '  Jon J. Martin, 4396 N. Prairie Willow Ct., Concord, CA 94521
  6. 11 '  Ken Goosens, 5020 Portsmouth Road, Fairfax, VA 22032
  7. 13 '
  8. 14 ' *******************************NOTICE*************************************
  9. 15 ' *  A limited license is granted to all users of this program and it's    *
  10. 16 ' *  companion program, CONFIG (version 17-1B), to make copies of this     *
  11. 17 ' *  program and distribute the copies to other users, on the following    *
  12. 18 ' *  conditions:                                                           *
  13. 19 ' *    1.   The notices contained in lines 3 through 29 of the program     *
  14. 20 ' *         are not altered, bypassed, or removed.                         *
  15. 21 ' *    2.   The program is not to be distributed to others in modified     *
  16. 22 ' *         form (i.e. the line numbers must remain the same).             *
  17. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  18. 24 ' *         for copying or distributing these programs without an express  *
  19. 25 ' *         written agreement with D. Thomas Mack, The Second Ring, 39     *
  20. 26 ' *         Cranbury Drive, Trumbull, Conneticut 06611                     *
  21. 27 ' *                                                                        *
  22. 28 ' *       Copyright (c) 1983-1988 D. Thomas Mack, The Second Ring          *
  23. 29 ' **************************************************************************
  24.    '
  25.    ' $INCLUDE: 'RBBS-VAR.BAS'
  26.    '
  27.    ' $SUBTITLE: 'Main-line RBBS-PC Program'
  28.     CRLF$ = CHR$(13) + CHR$(10)
  29.     J = 60
  30.     REDIM OPT.SEC(J)
  31.     CONFIG.FILENAME$ = "RBBS-PC.DEF"
  32.     CALL GETCOMND (DEBUG,NETIME$,NETBAUD$,NETRELIABLE$)
  33.     SUBROUTINE.PARAMETER = -62
  34.     BULLETIN.MENU$ = ""
  35.     CALL READDEF (CONFIG.FILENAME$)
  36.     IF EC > 0 THEN _
  37.        GOTO 31
  38.     CALL GIVEINIT
  39.     CALL MLINIT (1)
  40.     IF RECYCLE.TO.DOS OR DEBUG THEN _
  41.        GOTO 100
  42.     SUBROUTINE.PARAMETER = -9
  43.     CALL CARRIER
  44.     IF SUBROUTINE.PARAMETER THEN _
  45.        CALL COPYWRIT
  46.     GOTO 100
  47. 31  SNOOP = -1
  48.     CALL PSCRN ("Configuration "+CONFIG.FILENAME$+" missing or improper format.") : _
  49.     GOTO 204
  50. 100 CLEAR,,SIZE.OF.STACK
  51.     DEF SEG                            ' Point to BASIC
  52.     SCREEN 0,0,0                       ' Text, No color, Pg 0
  53.     WIDTH 80,25                        ' Set Screen Width and num of lines 'PE
  54.     KEY OFF                            ' Line 25 turned off
  55.     DEFINT A-Z                         ' All var. integer
  56. ' ********************* Variable Definitions ********************************
  57. 102 ADIM = 99
  58.     MM = 999
  59.     BX = 75
  60.     J = 60
  61.     REDIM OPT.SEC(J)
  62.     REDIM CATEGORY.NAME$(BX),CATEGORY.CODE$(BX),CATEGORY.DESC$(BX)
  63.     REDIM A$(ADIM)                      ' Message line table
  64.     REDIM B$(ADIM)                      ' Message line table
  65.     REDIM M(MM,2)                       ' Message pointers
  66.     CALL VARINIT
  67. 105 VERSION.ID$ = "  Maple ver 17  06/12/89"
  68. 106 CALL GETCOMND (DEBUG,NETIME$,NETBAUD$,NETRELIABLE$)
  69.     BACK.FROM.DOOR = FALSE
  70.     SUBROUTINE.PARAMETER = 1
  71.     CALL READDEF (CONFIG.FILENAME$)
  72.     IF EC > 0 THEN _
  73.        GOTO 31
  74.     USE.TPUT = (UPPER.CASE OR XON.XOFF)
  75.     ORIG.CALLERS$ = CALLERS.FILE$
  76.     ORIG.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  77.     ORIG.USER.FILE$ = MAIN.USER.FILE$
  78. '* ------[ first line different ]------
  79.     ORIG.MIN.SEC = MINIMUM.LOGON.SECURITY                            ' KG011501
  80.     ORIG.SYSOP.FN$ = SYSOP.FIRST.NAME$                               ' KG012603
  81.     ORIG.SYSOP.LN$ = SYSOP.LAST.NAME$                                ' KG012603
  82.     CALL BRKFNAME (ORIG.MESSAGE.FILE$,DRV$,ORIG.MSG.NAME$,Y$,FALSE)
  83.     IF ORIG.MSG.NAME$ = "MESSAGES" THEN _
  84.        ORIG.MSG.NAME$ = "MAIN" _
  85.     ELSE IF RIGHT$(ORIG.MSG.NAME$,1) = "M" THEN _
  86.             ORIG.MSG.NAME$ = LEFT$(ORIG.MSG.NAME$,LEN(ORIG.MSG.NAME$)-1)
  87.     GRN.NAME$ = ORIG.MSG.NAME$                                        'KG111103
  88.     IF NET.MAIL$ <> "NONE" AND VAL(NETIME$) > 0 THEN _
  89.        LIMIT.MINUTES.PER.SESSION! = VAL(NETIME$)
  90.     IF NET.MAIL$ <> "NONE" AND VAL(NETBAUD$) > 0 THEN _
  91.        EXPECT.ACTIVE.MODEM = TRUE : _
  92.        IF KEEP.INIT.BAUD > -1 THEN _                                 ' WM042201
  93.           IF KEEP.INIT.BAUD = 0 OR VAL (NETBAUD$) > 2400 THEN _      ' WM042201
  94.           MODEM.INIT.BAUD$ = NETBAUD$
  95.     IF FOSSIL THEN _
  96.        COMPORT% = VAL(RIGHT$(COM.PORT$,1)) - 1 : _
  97.        IF COMPORT% < 0 THEN _
  98.           GOTO 108 _
  99.        ELSE CALL FOSINIT(COMPORT%,RESULT%) : _
  100.             IF RESULT% = -1 THEN _
  101.                SNOOP = TRUE : _
  102.                CALL PSCRN("ERROR INITIALIZING FOSSIL") : _
  103.                GOTO 204
  104. 108 CALL BRKFNAME (CALLERS.FILE$,DRV$,X$,Y$,TRUE)
  105.     CALLERS.FILE.PREFIX$ = X$                                        ' KG102705
  106.     ARC.WORK$ = DRV$ + _
  107.                 "ARCWORK" + _
  108.                 NODE.FILE.ID$ + _
  109.                 ".DEF"
  110.     IF USE.BASIC.WRITES THEN _
  111.        LOCAL.BACKSPACE$ = BACK.ARROW$ _
  112.     ELSE LOCAL.BACKSPACE$ = BACKSPACE$
  113.     SYSOP.FULL.NAME$ = LEFT$(SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$,22)
  114. '
  115. ' *****  INITIALIZE NETBIOS INTERFACE   *****
  116. '
  117.    IF NETWORK.TYPE = 6 AND NOT SUB.BOARD THEN _
  118.       CALL INITIBM
  119. '
  120. ' *****  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE   ****
  121. '
  122.     CALL SETCALL
  123. 112 IF NOT SUB.BOARD THEN _
  124.        LOCAL.USER = TRUE : _
  125.        A$ = COLOR.RESET$ : _
  126.        SUBROUTINE.PARAMETER = 1 : _
  127.        CALL TPUT : _
  128.        LOCAL.USER = FALSE
  129.     UPLOAD.DRIVE.FILE$ = RIGHT$(DOWNLOAD.DRIVES$,1)+":FREESPAC.UPL"
  130. '
  131. ' *****  TEST FOR MESSAGE FILE PRESENT (ABORT IF NOT PRESENT)  *****
  132. '
  133. 135 IF CURRENT.DEF$ = ORIG.CONFIG$ THEN _
  134.        ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  135.        ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  136.     GOSUB 4910
  137.     IF CONFERENCE.MODE THEN _
  138.        GOTO 150
  139.     LOCAL.USER.MODE = (RIGHT$(COM.PORT$,1) < "1")
  140.     GET 1,NODE.RECORD.INDEX
  141.     Y$ = MID$(MESSAGE.RECORD$,77,2)
  142.     CALL UNCDATE (Y$,X,L,I,OLD.DAT$)
  143.     OLD.DAT$ = LEFT$(OLD.DAT$,6) + MID$(STR$(X),2)
  144.     TIME.TO.DROP.TO.DOS = - (TIME.TO.DROP.TO.DOS > 0) * TIME.TO.DROP.TO.DOS
  145.     HR! = INT(TIME.TO.DROP.TO.DOS / 100)
  146.     MN! = TIME.TO.DROP.TO.DOS - HR! * 100
  147.     TIME.TO.DROP.TO.DOS! = HR! * 3600 + MN! * 60
  148. '
  149. ' ******  TEST FOR TIMED EXIT ACTIVE   *****
  150. '
  151. 140 CALL FINDTIME (TI!)
  152.     IF TIME.TO.DROP.TO.DOS > 0 AND _
  153.        OLD.DAT$ <> DATE$ AND _
  154.        TI! >= TIME.TO.DROP.TO.DOS! THEN _
  155.        GOTO 206
  156. '
  157. ' **** GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER *
  158. '
  159. 150 IF SUB.BOARD THEN _
  160.        GOSUB 12987 : _
  161.        GOSUB 5135 : _
  162.        GOTO 170
  163.     SYSOP.AVAILABLE = VAL(MID$(MESSAGE.RECORD$,32,2))
  164.     SYSOP.ANNOY = VAL(MID$(MESSAGE.RECORD$,34,2))
  165.     SYSOP.NEXT = VAL(MID$(MESSAGE.RECORD$,36,2))
  166.     MID$(MESSAGE.RECORD$,36,2) = STR$(FALSE)
  167.     PRINTER = VAL(MID$(MESSAGE.RECORD$,38,2))
  168.     IF TURN.PRINTER.OFF THEN _
  169.        PRINTER = FALSE
  170.     EXIT.TO.DOORS = (VAL(MID$(MESSAGE.RECORD$,40,2)) AND NETBAUD$ = "")
  171.     EIGHT.BIT = VAL(MID$(MESSAGE.RECORD$,42,2))
  172.     BPS = VAL(MID$(MESSAGE.RECORD$,44,2))
  173.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  174.     MID$(MESSAGE.RECORD$,57,1) = "I"
  175.     PRIVATE.DOOR = VAL(MID$(MESSAGE.RECORD$,72,2))
  176.     MID$(MESSAGE.RECORD$,72,2) = STR$(FALSE)
  177.     LOCAL.USER = VAL(MID$(MESSAGE.RECORD$,101,2))
  178.     IF EXIT.TO.DOORS OR PRIVATE.DOOR THEN _
  179.        HAS.DOORED = TRUE : _                            'KP101201
  180.        TURBO.LOGON = TRUE
  181.     PUT 1,NODE.RECORD.INDEX
  182.     GOSUB 12985
  183. '
  184. ' *****  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER   *****
  185. '
  186. 160 CALL MLINIT (4)
  187. 170 FOR FUNCTION.KEY.INDEX = 1 TO 10
  188.        KEY FUNCTION.KEY.INDEX,""
  189.     NEXT
  190.     CALL LOADNEW (M())
  191. '
  192. ' ******  INITIALIZE FILE MANAGEMENT SYSTEM, CHECK FOR LOCAL BBS MODE *
  193. '
  194. 175 GOSUB 5344
  195.     CALL CTLINES (MAX.ENTRIES)
  196.     REDIM CATEGORY.NAME$(MAX.ENTRIES),CATEGORY.CODE$(MAX.ENTRIES),_
  197.           CATEGORY.DESC$(MAX.ENTRIES) : _
  198.     CALL INITFMS (CATEGORY.NAME$(),CATEGORY.CODE$(), _
  199.                   CATEGORY.DESC$(),NUM.CATEGORIES)
  200.     MAX.MESSAGE.LINES = MAX.MESSAGE.LINES.DEF                        ' KG111103
  201.     IF NOT LOCAL.USER THEN _
  202.        LOCAL.USER = LOCAL.USER.MODE
  203.     IF NOT SUB.BOARD THEN _                                          ' KG111101
  204.        CALL SETECHO (DEFAULT.ECHOER$)                                ' KG111101
  205.     CALL BRKFNAME (CALLERS.FILE$,DRV$,X$,Y$,TRUE)
  206.     NODE.WORK.FILE$ = DRV$ + _
  207.                       "NODE" + _
  208.                       NODE.FILE.ID$ + _
  209.                       "WRK"
  210.     SECONDS.PER.SESSION! = MINUTES.PER.SESSION! * 60
  211.     IF NOT LOCAL.USER.MODE THEN _
  212.        IF NOT EXIT.TO.DOORS THEN _
  213.           GOTO 180 _
  214.        ELSE IF NOT LOCAL.USER THEN _
  215.                GOTO 180
  216.     LOCAL.USER = TRUE
  217.     BPS = -6
  218.     BAUD.TEST = 9600
  219.     EIGHT.BIT = TRUE
  220.     SNOOP = TRUE
  221.     IF EXIT.TO.DOORS THEN _
  222.        CALL AMORPM : _
  223.        CALL READPROF : _
  224.        GOTO 410
  225.     GOSUB 178
  226.     GOTO 345
  227. 178 IF SUB.BOARD THEN _
  228.        IF FIRST.NAME$ = SYSOP.FIRST.NAME$ AND _
  229.           LAST.NAME$ = SYSOP.LAST.NAME$ THEN _
  230.              RETURN 832 _
  231.        ELSE RETURN 800
  232.     RETURN
  233. 180 SUBROUTINE.PARAMETER = 2
  234.     CALL LINE25
  235.     GOSUB 178
  236. '
  237. ' ******  WAIT FOR THE PHONE TO RING AND ANSWER IT   *****
  238. '
  239.     SUBROUTINE.PARAMETER = 1
  240. 200 TOGGLE.ONLY = TRUE
  241.     CALL ANSWERIT
  242.     GET 1,NODE.RECORD.INDEX
  243.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  244.     TOGGLE.ONLY = FALSE
  245.     IF EC > 1 THEN _
  246.        GOTO 13000
  247.     IF SUBROUTINE.PARAMETER < 0 THEN _
  248.        GOTO 202
  249.     ON SUBROUTINE.PARAMETER GOTO 410, _   '  1 = ANSWERED PHONE & CARRIER FOUND
  250.                                  330, _   '  2 = CARRIER FOUND BEFORE ANSWERING
  251.                                  822, _   '  3 = SYSOP GETS SYSTEM NEXT
  252.                                10595, _   '  4 = ANSWERED PHONE BUT NO CARRIER
  253.                                13540, _   '  5 = NOT USED
  254.                                  202, _   '  6 = LOCAL SYSOP KEY PRESSED
  255.                                  206, _   '  7 = TIME TO DROP TO DOS
  256.                                13538      '  8 = NO CALLS! TIME TO RECYCLE
  257. 202 FF = -SUBROUTINE.PARAMETER
  258.     ON FF GOTO 10595, _   '  -1 = CARRIER DROPPED
  259.                 4770, _   '  -2 = SYSOP INITIATED CHAT
  260.                  205, _   '  -3 = FORCE SYSTEM TO ANSWER THE PHONE
  261.                  204, _   '  -4 = EXIT TO DOS IMMEDEATELY
  262.                  203, _   '  -5 = EXIT TO DOS AFTER CLEAN-UP
  263.                10698, _   '  -6 = INDICATE ACCESS IS DENIED AND LOGOFF USER
  264.                10620      '  -7 = UPDATE CALLERS FILE AND LOGOFF USER
  265. 203 CALL MLINIT(3)
  266. 204 IF FOSSIL THEN _
  267.        CALL FOSEXIT(COMPORT%)
  268.     SYSTEM
  269. 205 SUBROUTINE.PARAMETER = 4
  270.     GOTO 200
  271. 206 CALL TIMEDOUT
  272.     GOTO 203
  273. 330 CALL CARRIER
  274.     IF SUBROUTINE.PARAMETER = -1 THEN _
  275.        GOTO 10595
  276.     CALL EOFCOMM (CHAR%)
  277.     IF CHAR% = -1 THEN _
  278.        GOTO 335
  279.     CALL FLUSHCOM (DF$)
  280.     IF SUBROUTINE.PARAMETER = -1 THEN _
  281.         GOTO 10595
  282.     GOTO 330
  283. 335 EXIT.TO.DOORS = FALSE
  284.     PRIVATE.DOOR = FALSE
  285.     IF C.L <> 1 THEN _
  286.        LOCATE 22,34
  287.     D$ ="CONNECT" + _
  288.         STR$(BAUD.TEST) + _
  289.         "     "
  290.     GOSUB 1315
  291. '
  292. ' *****  DISPLAY WELCOME LINE  *****
  293. '
  294. 345 LOCATE 24,1
  295.     SUBROUTINE.PARAMETER = 1
  296.     CALL AMORPM
  297.     CALL FINDTIME (USER.LOGON.TIME!)
  298.     TIME.LOGGED.ON$ = TIME$
  299.     LINES.PRINTED = 0
  300.     EXPERT.USER.DEF = EXPERT.USER
  301.     EXPERT.USER = FALSE
  302.     CALL SETEXPERT
  303.     IF NODES.IN.SYSTEM > 1 THEN _
  304.        A$ = " - NODE " + NODE.ID$ _
  305.     ELSE A$ = ""
  306.     CALL QTPUT("WELCOME TO " + RBBS.NAME$ + A$,1)
  307.     TEST.PARITY = TRUE
  308.     STOP.INTERRUPTS = TRUE
  309.     FILE.NAME$ = PRELOG$
  310.     CALL FLUSHCOM (X$)
  311.     COMMPORT.STACK$ = ""
  312. 346 GOSUB 466
  313.     IF SUBROUTINE.PARAMETER = -1 THEN _                              ' JM120601
  314.        GOTO 13540                                                    ' JM120601
  315.     FF = FALSE
  316. '********** Delete all the files in ARKVIEW.PATH$ **********
  317. '***********************************************************
  318. 'First create a Dummy file so the directory is not empty. It
  319. 'avoids having to use an ON ERROR routine if the directory
  320. 'is empty. Then just kill everything in the ARKVIEW.PATH$
  321. '***********************************************************
  322. CALL OPENOUTW(ARKVIEW.PATH$ + "\DANDAN.DAN")
  323.     CLOSE 2
  324.   CALL KILLWORK(ARKVIEW.PATH$ + "\*.*")
  325. '
  326. '
  327. ' *****************************************************************************
  328. '
  329. ' *****  GET USER NAME                                                      *
  330. ' *****  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS) *
  331. '
  332. 400 CALL SKIPLINE(1)
  333.     ESCAPE.INSECURE = FALSE
  334.     UPPER.CASE = FALSE
  335.     EXPERT.USER = EXPERT.USER.DEF
  336.     CALL SETEXPERT
  337.     A1$ = "What is your "
  338.     GOSUB 12500
  339.     CALL COMMINFO
  340.     IF FF THEN _
  341.        LOGON.ERROR.INDEX = 1 : _
  342.        GOTO 10620
  343.     IF MIN.OLDCALLER.BAUD > BAUD.TEST THEN _
  344.        CALL QTPUT (MID$(STR$(BAUD.TEST),2) + " BAUD ACCESS NOT ALLOWED!",2) : _
  345.        LG$(7) = "OLD CALLER BAUD RESTRICTION" : _
  346.        LOGON.ERROR.INDEX = 7 : _
  347.        GOTO 10620
  348.     TURBO.LOGON = (LEFT$(B$(4),1) = "!")
  349.     HOME.CONFERENCE$ = RIGHT$(B$(4),LEN(B$(4)) + TURBO.LOGON)
  350.     NUM.OF.TC = Q-3                                               'DGS-TTC
  351. '
  352. ' *****  CHECK IF SAME USER ON ANOTHER NODE   ****
  353. '
  354. 410 IF EXIT.TO.DOORS THEN _
  355.        CURRENT.DATE$ = MID$(MESSAGE.RECORD$,119,2) + _
  356.                        "-" + _
  357.                        MID$(MESSAGE.RECORD$,121,2) + _
  358.                        "-" + _
  359.                        MID$(MESSAGE.RECORD$,123,2) : _
  360.        TIM$ = MID$(MESSAGE.RECORD$,125,2) + _
  361.               ":" + _
  362.               RIGHT$(MESSAGE.RECORD$,2) : _
  363.        IF LEFT$(TIM$,2) < "12" THEN _
  364.           TIM$ = TIM$ + _
  365.                  " AM" _
  366.        ELSE TIM$ = TIM$ + _
  367.                    " PM"
  368.     NODE.INDEX = 2
  369.     XX = NODES.IN.SYSTEM + 1
  370. 412 IF NODE.INDEX > XX THEN _
  371.        GOTO 430
  372.     GET 1,NODE.INDEX
  373.     IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  374.        GOTO 420
  375.     NODE.INDEX = NODE.INDEX + 1
  376.     GOTO 412
  377. 420 IF MID$(MESSAGE.RECORD$,57,1) = "A" THEN _
  378.        LOGON.ERROR.INDEX = 6 : _
  379.        LG$(6) = LG$(6) + _
  380.                 LEFT$(MESSAGE.RECORD$,25) : _
  381.        A$ = "Name <" + ACTIVE.USER.NAME$ + "> in use on another node" : _
  382.        CALL RINGCALLER : _
  383.        GOTO 10620
  384.     FIRST.NAME$ = LEFT$(MESSAGE.RECORD$,INSTR(MESSAGE.RECORD$, " ") - 1)
  385.     IF NOT PRIVATE.DOOR THEN _
  386.        CALL SKIPLINE (1) : _
  387.        CALL QTPUT(FIRST.NAME$ + ", welcome back!",1)
  388.     IF EXIT.TO.DOORS THEN _                                          ' KG101404
  389.        GOTO 457                                                      ' KG101404
  390. '
  391. ' *****  TEST FOR REMOTE SYSOP LOGGING ON   ****
  392. '
  393. 430 GET 1,NODE.RECORD.INDEX
  394.     SAME.USER = (ACTIVE.USER.NAME$ = LEFT$(MESSAGE.RECORD$,LEN(ACTIVE.USER.NAME$)))
  395.     DEL.SPACE = INSTR(MID$(MESSAGE.RECORD$,1,31),"  ")               'JAB110286
  396.     PREV.USER.NAME$ = MID$(MESSAGE.RECORD$,1,DEL.SPACE+1) +_         'JAB110286
  397.     MID$(MESSAGE.RECORD$,93,24)                      'JAB110286
  398. '
  399. ' *****  TEST FOR SYSOP NAME ATTEMPT  ****
  400. '
  401. 445 IF INSTR(ACTIVE.USER.NAME$,"SYSOP") OR _
  402.        INSTR(ACTIVE.USER.NAME$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  403.        LOGON.ERROR.INDEX = 2 : _
  404.        GOTO 10620
  405. '
  406. ' *****  REMOVE INVALID CHARACTERS FROM USER NAME  ****
  407. '
  408. 455 CALL BADCHAR (ACTIVE.USER.NAME$)
  409.     IF ACTIVE.USER.NAME$ = "" THEN _
  410.        GOTO 400
  411. '
  412. ' ****  CHECK FOR ACTIVE USER   ****
  413. '
  414. 457 CALL SKIPLINE (1)
  415.     GOSUB 12840
  416.     GOSUB 12850
  417.     GOSUB 12598
  418.     GOSUB 11482
  419.     CALL COMPDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,TODAY.COMPUTE.DATE!)
  420.     IF NOT FOUND THEN _
  421.        GOTO 700
  422.     GOSUB 12984
  423. '
  424. ' *****  ACTIVE USER FOUND  *****
  425. '
  426. 459 GOSUB 9500
  427.     LAST.DATE.TIME.ON.SAVE$ = LAST.DATE.TIME.ON$
  428.     IF EXIT.TO.DOORS THEN _
  429.        TEMP.HOLD.TIME! = VAL(LEFT$(TIM$,2))*3600 + _
  430.                          VAL(MID$(TIM$,4,2))*60 : _
  431.        CALL FINDTIME (USER.LOGON.TIME!) : _
  432.        MINUTES.IN.DOORS = INT((USER.LOGON.TIME! - _
  433.                               (USER.LOGON.TIME! <= TEMP.HOLD.TIME!)*86400 - _
  434.                               TEMP.HOLD.TIME!) / 60) : _
  435.        CALL TIMEREMAIN (TIME.REMAINING!)
  436.     USER.FILE.INDEX = LOC(5)
  437.     GOSUB 5135
  438. '
  439. ' ***  COMPUTE THE NUMBER OF DAYS REMAINING UNTIL REGISTRATION EXPIRES ***
  440. '
  441.     IF RESTRICT.BY.DATE THEN _
  442.        CALL COMPDATE (USER.REG.YY,USER.REG.MM,USER.REG.DD,USER.COMPUTE.DATE!) : _
  443.        REG.DAYS.REMAINING = USER.COMPUTE.DATE! + _
  444.                             DAYS.IN.REGISTRATION.PERIOD - _
  445.                             TODAY.COMPUTE.DATE! : _
  446.        CALL EXPDATE (USER.COMPUTE.DATE!,DAYS.IN.REGISTRATION.PERIOD,EXPIRATION.DATE$) _
  447.     ELSE REG.DAYS.REMAINING = 365
  448.     IF NOT PRIVATE.DOOR THEN _
  449.        IF REG.DAYS.REMAINING < 0 THEN _
  450.        IF USER.SECURITY.LEVEL > EXPIRED.SECURITY THEN _
  451.           CALL QTPUT (LG$(9) + _
  452.                       " - security reset to " + _
  453.                       STR$(EXPIRED.SECURITY),1) : _
  454.           LOGON.ERROR.INDEX = 9 : _
  455.           USER.SECURITY.LEVEL = EXPIRED.SECURITY : _
  456.           LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  457.           GOSUB 5135
  458. 460 USER.SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)
  459.     IF USER.SECURITY.LEVEL > -1 THEN _
  460.        USER.SECURITY.LEVEL$ = MID$(USER.SECURITY.LEVEL$,2)
  461.     IF USER.SECURITY.LEVEL >= MINIMUM.LOGON.SECURITY THEN _
  462.        GOTO 470
  463.     IF NOT PRIVATE.DOOR THEN _
  464.        GOSUB 465 : _
  465.        CALL DELAYIT (8 + BPS)
  466.     IF LOGON.ERROR.INDEX < 9 AND _
  467.        EC = 0 THEN _
  468.        LOGON.ERROR.INDEX = 8
  469.     GOTO 10620
  470. '
  471. ' ***  DISPLAY LOG-ON MESSAGE FOR SPECIFIC SECURITY LEVEL  ***
  472. '
  473. 465 TURBO.LOGON = TURBO.LOGON AND (EXIT.TO.DOORS OR _
  474.                   (USER.SECURITY.LEVEL >= ALLOW.CALLER.TURBO))
  475.     IF TURBO.LOGON THEN _
  476.        RETURN
  477.     FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  478.                  "LG" + _
  479.                  USER.SECURITY.LEVEL$ + _
  480.                  ".DEF"
  481.     CALL GRAPHIC (USER.GRAPHIC.DEFAULT$)                             ' KG101507
  482. 466 STOP.INTERRUPTS = TRUE
  483.     BYPASS.TIME.CHECK = TRUE
  484.     CALL BUFFILE (FILE.NAME$,X)
  485.     RETURN
  486. 470 GOSUB 12989
  487.     CI$ = CITY.STATE$
  488.     CALL TRIM (CI$)
  489.     ATTEMPTS.ALLOWED = 4
  490.     PASSWORD.SAVE$ = PASSWORD$
  491.     TEMP.SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  492.     MESSAGE.PASSWORD = FALSE
  493.     IF NOT SUB.BOARD THEN _
  494.        ELAPSED.TIME = CVI(ELAPSED.TIME$)
  495.     IF NOT EXIT.TO.DOORS THEN _
  496.          IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON$,8) THEN _
  497.             IF ELAPSED.TIME > 0 OR NOT KEEP.TIME.CREDITS THEN _
  498.                ELAPSED.TIME = 0
  499.     IF PRIVATE.DOOR AND _
  500.        TRANSFER.FUNCTION = 3 THEN _
  501.        GOSUB 755 : _
  502.        GOTO 800
  503.     IF PASSWORD.SAVE$ = SPACE$(LEN(PASSWORD.SAVE$)) THEN _
  504.        GOSUB 755 : _
  505.        GOTO 800
  506. 480 GOSUB 5370
  507.     IF PRIVATE.DOOR OR (A AND ESCAPE.INSECURE) THEN _
  508.        Z$ = PASSWORD.SAVE$ : _
  509.        PASSWORD.FAILED = 0 : _
  510.        GOTO 644
  511.     IF Q => 3 THEN _
  512.        Z$ = B$(3) : _
  513.        ATTEMPTS = 1 : _
  514.        SUBROUTINE.PARAMETER = 5 _
  515.     ELSE SUBROUTINE.PARAMETER = 4
  516.     CALL PASSWRD
  517. 630 IF PASSWORD.FAILED THEN _
  518.     TIMES.LOGGED.ON = CVI(MID$(USER.OPTIONS$,1,2)) - _
  519.         ((ORIG.CONFIG$ <> CURRENT.DEF$ OR NOT SUB.BOARD) AND _    
  520.         (NOT PRIVATE.DOOR) AND (NOT EXIT.TO.DOORS) ): _     'PE DOORFIX
  521.        ELAPSED.TIME = CVI(ELAPSED.TIME$): _                 'PE DOORFIX
  522.        GOSUB 5382 : _                     'PE DOORFIX
  523.        GOSUB 814 : _                      'PE DOORFIX
  524.        GOSUB 825 : _                                                 ' KG112503
  525.        LOGON.ERROR.INDEX = 4 : _
  526.        GOTO 10620
  527. 643 GOSUB 41070
  528. 644 NEW.USER = FALSE
  529.     WK$ = RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,2))),2) + _   ' MM
  530.            "/" + _
  531.            RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,3))),2) + _   ' DD
  532.            "/" + _
  533.            RIGHT$(STR$(ASC(LIST.NEW.DATE$)),2)               ' YY
  534.     LM$ = RIGHT$(WK$,2) + _                                 ' YY
  535.           LEFT$(WK$,2) + _                                  ' MM
  536.           MID$(WK$,4,2)                                     ' DD
  537.     IF MID$(LM$,3,1) = " " THEN _
  538.        MID$(LM$,3,1) = "0"
  539. 655 IF MID$(LM$,5,1) = " " THEN _
  540.        MID$(LM$,5,1) = "0"
  541. 660  GOTO 800
  542. '
  543. ' ****  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)  ****
  544. '
  545. 700 EXPERT.USER = FALSE
  546.     CALL SETEXPERT
  547.     IF MIN.NEWCALLER.BAUD > BAUD.TEST THEN _
  548.        CALL QTPUT ("(" + MID$(STR$(BAUD.TEST),2) + " BAUD ACCESS FOR REGISTERED USERS ONLY)",2) : _
  549.        LG$(7) = "NEW CALLER BAUD RESTRICTION" : _
  550.        LOGON.ERROR.INDEX = 7 : _
  551.        GOTO 10620
  552.     CALL QTPUT ("Name not found",1)
  553.     GOSUB 12558
  554.     IF NO THEN _
  555.        GOSUB 12990 : _
  556.        GOTO 400
  557.     CALL LINE25                                                      ' KG102703
  558.     Z$ = FIRST.NAME$
  559.     GOSUB 12570
  560.     IF FOUND THEN _
  561.        GOSUB 12984 : _
  562.        GOTO 12595
  563.     Z$ = LAST.NAME$
  564.     GOSUB 12570
  565.     IF FOUND THEN _
  566.        GOSUB 12984 : _
  567.        GOTO 12595
  568.     TURBO.LOGON = FALSE
  569. 710 IF USER.FILE.INDEX = 0 AND NOT SURVIVE.NOUSER.ROOM THEN _
  570.        GOTO 13540
  571. 720 GOSUB 5370
  572.     IF A THEN _
  573.        USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL _
  574.     ELSE USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL
  575. 725 IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY THEN _
  576.        LOGON.ERROR.INDEX = 1 : _
  577.        GOTO 460
  578.     IF FIRST.NAME$ = LAST.NAME$ THEN _
  579. CALL QTPUT (FIRST.NAME.PROMPT$+"/"+LAST.NAME.PROMPT$+" cannot be same",1) : _ ' KG112502
  580.        LOGON.ERROR.INDEX = 3 : _
  581.        GOTO 10620
  582.     IF NOT REMEMBER.NEW.USERS THEN _
  583.        GOSUB 13700 : _
  584.        USER.FILE.INDEX = 0 : _
  585.        GOSUB 12960: _
  586.        PREV.LAST.ON$ = "00-00-00": _
  587.        GOTO 735
  588.     NEW.USER = TRUE
  589.     CALL OPENUSER (HIGHEST.USER.RECORD)
  590.     GOSUB 9450
  591.     GOSUB 12630
  592.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = LEFT$("NEWUSER",LEN.HASH)
  593.     IF START.INDIV>0 THEN _
  594.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  595.     GOSUB 9440
  596. 730 GOSUB 12960
  597. 735 BYPASS.TIME.CHECK = TRUE
  598.     CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  599.     CALL LINE25                              'KG102703
  600.     FILE.NAME$ = NEWUSER.FILE$
  601.     STOP.INTERRUPTS = TRUE
  602.     GOSUB 1790
  603.     CALL SKIPLINE(1)
  604. 739 CALL QTPUT(ACTIVE.USER.NAME$ + " from " + CI$,1)
  605. 740 A$ = "C)hange name/address, D)isconnect, [R]egister"
  606.     GOSUB 12995
  607.     IF Q = 0 THEN _
  608.        Z$ = "R" _
  609.     ELSE CALL ALLCAPS (B$(1)) : _
  610.          Z$ = B$(1)
  611.     S = INSTR("CDR",Z$)
  612. 745 IF NOT REMEMBER.NEW.USERS THEN _
  613.        ON S GOTO 748,752,754
  614.     ON S GOTO 747,750,760
  615.     GOTO 740
  616. 747 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  617.                            " changed Name/Address",2)
  618.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  619.     GOSUB 9440
  620.     GOSUB 12991
  621. 748 FF = FALSE
  622.     GOTO 400
  623. '
  624. ' ***  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER) ***
  625. '
  626. 750 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  627.                            " didn't register",2)
  628.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  629.     GOSUB 9440
  630.     GOSUB 12991
  631. 752 FF = FALSE
  632.     USER.FILE.INDEX = 0
  633.     GOTO 13540
  634. '
  635. ' *****  GET AND VERIFY PASSWORD   *****
  636. '
  637. 754 CALL QTPUT ("GUEST privileges granted.  RE-REGISTER on future calls",1)
  638.     USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  639.     GOTO 832
  640. 755 IF PRIVATE.DOOR THEN _
  641.        B$ = PASSWORD$ : _
  642.        Z$ = B$ : _
  643.        RETURN
  644.     GOSUB 12800
  645.     A$ = "Re-Enter PASSWORD for verification (Dots Echo)"   'KG101508
  646.     GOSUB 45010
  647.     SWAP Z$,B$
  648.     CALL ALLCAPS (Z$)
  649.     IF B$ <> Z$ THEN _
  650.        CALL QTPUT ("Passwords Don't match!",1) : _
  651.        GOTO 755
  652.     RETURN
  653. '
  654. ' ***  R - COMMAND FROM NEWUSER ROUTINE - REGISTER   ***
  655. '
  656. 760 GOSUB 755
  657.     CALL ALLCAPS (Z$)
  658.     LSET PASSWORD$ = Z$
  659.     CALL QTPUT("Please REMEMBER your password",1)
  660.     USER.TEXT.COLOR = 37
  661.     TEMP.SECURITY.LEVEL = USER.SECURITY.LEVEL
  662.     CALL PROTOCOL
  663.     USER.TRANSFER.DEFAULT$ = "N"
  664.     PROTO.PROMPT$ = "None"
  665.     IF NEWUSER.SETS.DEFAULTS THEN _
  666.        GOSUB 42950 : _
  667.        BYPASS.TIME.CHECK = TRUE : _
  668.        GOSUB 43000 : _
  669.        BYPASS.TIME.CHECK = FALSE : _
  670.        CALL GRAPHIC (USER.GRAPHIC.DEFAULT$) : _
  671.        GOSUB 42805 : _
  672.        GOSUB 42700 _
  673.     ELSE UPPER.CASE = FALSE : _
  674.          HIGHLIGHT.OFF = TRUE : _                                    ' KG123101
  675.          CALL SETUGD (0,USER.GRAPHIC.DEFAULT$) : _
  676.          NULLS = FALSE
  677.     GOSUB 12900
  678.     GOSUB 5135
  679.     CALL DEFAULTU
  680.     FILE.NAME$ = NEW.USER.QUESTIONNAIRE$
  681.     GOSUB 11520
  682.     LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  683.     USER.SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)                 ' KG101507
  684.     CALL REMOVE (USER.SECURITY.LEVEL$," ")                           ' KG101507
  685. '
  686. ' ****  LOGIN ALL USERS  ****
  687. '
  688. 800 IF ORIG.CONFIG$ = CURRENT.DEF$ THEN _
  689.        MAIN.USER.FILE.INDEX = USER.FILE.INDEX : _
  690.        USER.SECURITY.SAVE = USER.SECURITY.LEVEL : _
  691.         ORIG.FIRST.NAME$ = FIRST.NAME$ : _                          'DGS-ALS
  692.        ORIG.USER.NAME$ = ACTIVE.USER.NAME$
  693.     TIMES.LOGGED.ON = CVI(MID$(USER.OPTIONS$,1,2)) - _
  694.         ((ORIG.CONFIG$ <> CURRENT.DEF$ OR NOT SUB.BOARD) AND _    'KG101504
  695.         (NOT PRIVATE.DOOR) AND (NOT EXIT.TO.DOORS))               ' KP101104
  696.     GOSUB 9500
  697.     IF NOT EXIT.TO.DOORS THEN _
  698.        CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _         ' KG120302
  699.                  " Lvl" + STR$(USER.SECURITY.LEVEL) + " " + TIME$,2) ' KG101506
  700.     PREV.LAST.ON$ = LAST.DATE.TIME.ON$
  701.    IF LOCAL.USER THEN _
  702.        TALK.TO.MODEM.AT$ = "9600" : _
  703.        BAUD.PARITY$ = "9600 BAUD,N,8,1" : _
  704.        MODEM.INIT.BAUD$ = "9600" : _
  705.        SNOOP = TRUE : _
  706.        LINE.FEEDS = TRUE
  707.     CALL SETCRLF
  708.     CALL CALLOPT
  709.     CALL XFERTYPE (2,TRUE)
  710.     IF NOT SUB.BOARD THEN _
  711.        BOARD.CHECK.DATE$ = PREV.LAST.ON$
  712.     IF PRIVATE.DOOR OR SUB.BOARD THEN _
  713.     GOSUB 814 : _                            'PE DOORFIX
  714.     GOTO 815                                 'PE DOORFIX
  715.     GOSUB 465
  716. '    IF (EIGHT.BIT AND _
  717. '       AUTODOWNLOAD.DESIRED) OR _
  718. '       ASK.IDENTITY THEN _
  719. '       CALL TESTUSER
  720.     CALL QTPUT (FG.1$+"Logging "+FG.4$ + ACTIVE.USER.NAME$,1)
  721.     CALL QTPUT (FG.3$+"RBBS-PC " + CX$(4)+VERSION.ID$ +FG.1$+CRLF$+ "NODE " + NODE.ID$ + _
  722.         CX$(1)+ ", OPERATING AT " +FG.2$+ BAUD.PARITY$,1)
  723.     CALL SKIPLINE (1)
  724.     CALL DELAYIT (2)     'PeteEibl 110188
  725.     ATTEMPTS = 0
  726. CALL DOORRTN
  727. GOSUB 814              'PE DOORFIX
  728. GOTO  815              'PE DOORFIX
  729. '
  730. ' *****  NOTIFY THE CALLER IF THEY ARE ABLE TO USE "AUTODOWNLOADING"  ****
  731. '
  732. '    IF EIGHT.BIT AND AUTODOWNLOAD.AVAILABLE THEN _
  733. '       A$ = CHR$(9) + _
  734. '            crlf$ + _
  735. '         CX$(1)+   "You may use AUTODOWNLOADing!" : _
  736. '       CALL RINGCALLER : _
  737. '       CALL DELAYIT(4)
  738. 814   DOWNLOADS = CVI(USER.DOWNLOADS$)
  739.        UPLOADS = CVI(USER.UPLOADS$)
  740.        DL.TODAY! = CVS(TODAY.DL$)
  741.        BYTES.TODAY! = CVS(TODAY.BYTES$)
  742.        DLBYTES! = CVS(DL.BYTES$)
  743.        ULBYTES! = CVS(UL.BYTES$)
  744.     IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON.SAVE$,8) THEN _
  745.        DL.TODAY! = 0 : _
  746.        BYTES.TODAY! = 0
  747.  IF SUB.BOARD THEN _
  748.          GLOBALS.SET = TRUE : _                                   ' GLOBALS FIX
  749.          UPLOADS = GLOBAL.UPLOADS : _                             ' GLOBALS FIX
  750.          DOWNLOADS = GLOBAL.DOWNLOADS : _                         ' GLOBALS FIX
  751.          DL.TODAY! = GLOBAL.DL.TODAY! : _                         ' GLOBALS FIX
  752.          BYTES.TODAY! = GLOBAL.BYTES.TODAY! : _                   ' GLOBALS FIX
  753.          DLBYTES! = GLOBAL.DLBYTES! : _                           ' GLOBALS FIX
  754.          ULBYTES! = GLOBAL.ULBYTES!                               ' GLOBALS FIX
  755.  IF RATIO.RESTRICTION# > 0 THEN _                                 'PE GLOBAL
  756.   IF BYTE.METHOD = 0 AND GLOBAL.UPLOADS < INITIAL.CREDIT# THEN _  'PE GLOBAL
  757.     GLOBAL.UPLOADS = INITIAL.CREDIT# _                           'PE GLOBAL
  758. ELSE IF BYTE.METHOD = 1 AND GLOBAL.ULBYTES! < INITIAL.CREDIT# THEN _ 'PE GLOBAL
  759.        GLOBAL.ULBYTES! = INITIAL.CREDIT#                             'PE GLOBAL
  760.     IF NOT GLOBALS.SET THEN _                                        ' KG102004
  761.        GLOBALS.SET = TRUE : _                                        ' KG102004
  762.        GLOBAL.DOWNLOADS = DOWNLOADS : _                              ' KG102004
  763.        GLOBAL.UPLOADS = UPLOADS : _                                  ' KG102004
  764.        GLOBAL.DL.TODAY! = DL.TODAY! : _                              ' KG102004
  765.        GLOBAL.BYTES.TODAY! = BYTES.TODAY! : _                        ' KG102004
  766.        GLOBAL.DLBYTES! = DLBYTES! : _                                ' KG102004
  767.        GLOBAL.ULBYTES! = ULBYTES!
  768.     IF RATIO.RESTRICTION# > 0 THEN _
  769.        IF BYTE.METHOD = 0 AND UPLOADS < INITIAL.CREDIT# THEN _
  770.           UPLOADS = INITIAL.CREDIT# _
  771.        ELSE IF BYTE.METHOD = 1 AND ULBYTES! < INITIAL.CREDIT# THEN _
  772.                ULBYTES! = INITIAL.CREDIT#
  773.     LAST.MESSAGE.READ = -LAST.MESSAGE.READ * (LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  774.     LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  775.                          MID$(USER.OPTIONS$,3)
  776.     LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  777.                               " " + _
  778.                               TIME.LOGGED.ON$
  779.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  780.     IF START.INDIV > 0 THEN _
  781.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  782.     LSET USER.NAME$ = ORIG.USER.NAME$
  783.     IF (NOT EXIT.TO.DOORS) AND NOT (ORIG.MESSAGE.FILE$ = ACTIVE.MESSAGE.FILE$ AND SUB.BOARD) THEN _
  784.        CALL AUTOPAGE
  785.     IF NOT SUB.BOARD THEN _
  786.        ORIG.USER.FILE.INDEX = USER.FILE.INDEX
  787.     RETURN                                        'PE DOORFIX
  788. 815 GOSUB 9440                                    'PE DOORFIX
  789.     GOSUB 12991
  790.     CALL ASKMORE ("",TRUE,TRUE,XX,TRUE)     'PE 04/06/89
  791.     IF TURBO.LOGON THEN _
  792.        GOTO 821
  793.     IF NOT SAME.USER THEN _
  794.        STOP.INTERRUPTS = NOT WELCOME.INTERRUPTABLE : _
  795.        BYPASS.TIME.CHECK = TRUE : _
  796.        FILE.NAME$ = WELCOME.FILE$ : _
  797.        DISPLAY.AS.UNIT = TRUE : _
  798.        GOSUB 1790 : _
  799.        DISPLAY.AS.UNIT = FALSE
  800.     BYPASS.TIME.CHECK = FALSE
  801.     STOP.INTERRUPTS = NOT WELCOME.INTERRUPTABLE            'Pe 04/01/89
  802.     IF PRIVATE.DOOR OR SUB.BOARD THEN _                    'Pe 04/01/89
  803.        GOTO 816
  804. ' **** added NEWS file here *******
  805.     FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  806.                  "NEWS.DEF"
  807.     CALL FINDIT (FILE.NAME$)
  808.      IF  OK THEN _
  809.      CALL QTPUT (CHR$(12),O) : _                 'Pe 04/01/89
  810.      GOSUB 1790
  811. '*** end of NEWS file mod
  812. '
  813. 816 CALL QTPUT (CHR$(12),0)             'Pe CLS mod
  814.       IF NOT NEW.USER THEN _
  815.        CALL QTPUT(FG.1$+"Times on:" +fg.3$+ STR$(TIMES.LOGGED.ON)+CRLF$ + _
  816.         +CX$(4)+ "Last on  was: "+FG.3$ + PREV.LAST.ON$,1)
  817. 817 IF NOT REMIND.FILE.TRANSFERS OR NEW.USER THEN _
  818.        GOTO 818
  819.        CALL CHECKRATIO (FALSE)
  820. 818  IF INSTR(PREV.USER.NAME$,"SYSOP") THEN _
  821.        GOTO 819
  822.   '   PREV.USER.NAME$ = SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$
  823. '
  824. IF ACTIVE.USER.FILE$ = ORIG.USER.FILE$ THEN _   'Pe 02/11/89
  825.     CALL QTPUT(FG.4$+"Previous caller was: "+FG.2$ + PREV.USER.NAME$+EMPHASIZE.OFF$,1)
  826. 819  CALL ASKMORE ("",TRUE,FALSE,X,TRUE)
  827.       IF REMIND.PROFILE THEN _
  828.        GOSUB 5400
  829. 821 CALL TRIM (CI$)
  830.     GOSUB 5370
  831.     IF A THEN _
  832.        ACTIVE.USER.NAME$ = "SYSOP"
  833.     GOSUB 4910
  834.     GOSUB 24000
  835.     GET 1,NODE.RECORD.INDEX
  836.     MID$(MESSAGE.RECORD$,1,31) = ACTIVE.USER.NAME$ + _
  837.                                  SPACE$(31 - LEN(ACTIVE.USER.NAME$))
  838.     MID$(MESSAGE.RECORD$,40,2) = " 0"
  839.     MID$(MESSAGE.RECORD$,44,2) = STR$(BPS)
  840.     MID$(MESSAGE.RECORD$,55,2) = " 0"
  841.     MID$(MESSAGE.RECORD$,57,1) = "A"
  842.     MID$(MESSAGE.RECORD$,60,5) = TALK.TO.MODEM.AT$ + _
  843.                                  SPACE$(5 - LEN(TALK.TO.MODEM.AT$))
  844.     MID$(MESSAGE.RECORD$,72,2) = " 0"
  845.     MID$(MESSAGE.RECORD$,93,24) = CI$ + _
  846.                                   SPACE$(24)
  847.     PUT 1,NODE.RECORD.INDEX
  848.     GOSUB 12985
  849.     IF EXIT.TO.DOORS THEN _
  850.        IF TRANSFER.FUNCTION = 3 THEN _
  851.           NEW.USER = TRUE : _                                        ' KG122402
  852.           TURBO.LOGON = FALSE : _                                    ' KG122402
  853.           SAME.USER = FALSE : _                                      ' KG122402
  854.           TRANSFER.FUNCTION = 0 : _
  855.           GOTO 832 _
  856.        ELSE GOTO 832
  857.     IF NOT NEW.USER THEN _
  858.        GOTO 832
  859.     Z$ = REGISTRATION.PROGRAM$
  860.     TRANSFER.FUNCTION = 3
  861.     CALL DOOREXIT
  862.     TRANSFER.FUNCTION = 0  'FOUND THIS at the end of the line ==>  3
  863.     GOTO 832
  864. '
  865. ' ****  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE   ****
  866. '
  867. 822 LOCATE 24,1
  868.     CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  869.     LOCAL.USER = TRUE
  870.     SNOOP = TRUE
  871.     SYSOP = TRUE                        'KG102003
  872.     WAIT.BEFORE.DISCONNECT = 32400
  873.     BPS = -6
  874.     CALL COMMINFO
  875.     IF NOT ESCAPE.INSECURE THEN _
  876.        GOTO 345
  877.     ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  878.     FIRST.NAME$ = SYSOP.PASSWORD.1$
  879.     LAST.NAME$ = SYSOP.PASSWORD.2$
  880.     CALL FINDTIME (USER.LOGON.TIME!)
  881.     TIME.LOGGED.ON$ = TIME$                                          ' KG112002
  882.     GOTO 457
  883. 825 X = (MAX.PER.DAY - MINUTES.PER.SESSION!)                         ' KG112503
  884.     X = -X * (X > 0)    ' extra from daily max                       ' KG112503
  885.     Q! = X + MINUTES.PER.SESSION! + (MAX.PER.DAY > 0) * ELAPSED.TIME ' KG112503
  886.     IF Q! > MINUTES.PER.SESSION! THEN _                              ' KG112503
  887.        Q! = MINUTES.PER.SESSION!                                     ' KG112503
  888.     SECONDS.PER.SESSION! = (Q! - MINUTES.IN.DOORS)* 60 + TIME.CREDITS! ' KG112503
  889.     RETURN                                                           ' KG112503
  890. 832 IF REG.DAYS.REMAINING <= DAYS.TO.WARN AND _
  891.        RESTRICT.BY.DATE AND REG.DAYS.REMAINING > 0 AND _
  892. USER.SECURITY.LEVEL > EXPIRED.SECURITY THEN _ 
  893.        CALL QTPUT ("Registration EXPIRES in" + _
  894.                    STR$(REG.DAYS.REMAINING) + " days!",1) : _
  895.        CALL DELAYIT (3)
  896.     IF (NOT REQ.QUES.ANSWERED) AND _
  897.        REQUIRED.QUESTIONNAIRE$ <> "" THEN _
  898.          FILE.NAME$ = REQUIRED.QUESTIONNAIRE$ : _
  899.          GOSUB 11520 : _
  900.          IF OK THEN _
  901.             REQ.QUES.ANSWERED = TRUE
  902. 837 Z$ = ACTIVE.USER.NAME$ + _
  903.             " on at " + _
  904.             CURRENT.DATE$ + _
  905.             ", " + _
  906.             TIM$ + _
  907.             " from " + _
  908.             CI$ + _
  909.             ", " + _
  910.             BAUD.PARITY$
  911.      NG$ = Z$ + SPACE$(128 - LEN(Z$))
  912.      MESSAGE.USER.NAME$ = LEFT$(ACTIVE.USER.NAME$,22)
  913. '
  914. ' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT     *
  915. '
  916.      X$ = "{" + _
  917.           HASH.VALUE$ + _
  918.           "/" + _
  919.           INDIV.VALUE$ + _
  920.           "}"
  921.      IF LEN(Z$) < 65 THEN _
  922.         X = 65 _
  923.      ELSE X = LEN(Z$) + 2
  924.      MID$(NG$,X) = X$
  925.      CALL PRINTIT ("  " + Z$)
  926.      IF NEW.USER THEN _
  927.         CALL UPDTCALR ("NEWUSER",1)
  928. 842 GOSUB 825                                                       'KG112503
  929.     SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  930.     GOSUB 12987
  931.     IF SUB.BOARD THEN _
  932.        GOTO 850
  933.     GOSUB 12986                                                      ' KG101203
  934.     GOSUB 23000                                                      ' KG101203
  935.     CALLS.TODATE! = CALLS.TODATE! + 1 + (SYSOP OR HAS.DOORED)        ' KG101203
  936.     GOSUB 24000                                                      ' KG101203
  937.     GOSUB 12985                                                      ' KG101203
  938. 850 SUBROUTINE.PARAMETER = 2
  939.     CALL LINE25
  940.     CALL SKIPLINE (1)
  941.     IF TURBO.LOGON THEN _
  942.        BULLETIN.SAVE$ = BULLETIN.MENU$ : _                  ' KP101108
  943.        GOTO 900
  944.     CALL CTNEWFILES (BOARD.CHECK.DATE$,M(),LAST.NEW,A$)
  945.     IF FMS.DIRECTORY$ <> "" THEN _
  946. CALL QTPUT(CX$(1)+A$ + FG.1$+STR$(LAST.NEW) + FG.2$+" NEW file(s) since last on"+EMPHASIZE.OFF$,1) _
  947.     ELSE GOTO 852
  948.     IF NEW.USER OR LAST.NEW < 1 OR NOT NEW.FILES.CHECK THEN _
  949.        GOTO 852
  950.     L = LEN(DOWNLOAD.DRIVES$)
  951.     OSS = 19
  952.     IF (NOT SKIP.FILES.LOGON) AND _
  953.        (USER.SECURITY.LEVEL >= MIN.SEC.TO.VIEW) AND _
  954.        USER.SECURITY.LEVEL >= OPT.SEC(OSS) THEN _
  955.           A$ = "Review new files to download ([Y],N)" : _
  956.           GOSUB 12999 : _
  957.           IF NOT NO THEN _
  958.              Q = 3 : _
  959.              B$(2) = MID$(BOARD.CHECK.DATE$,1,2) + _
  960.                      MID$(BOARD.CHECK.DATE$,4,2) + _
  961.                      MID$(BOARD.CHECK.DATE$,7,2) : _
  962.              Y$ = B$(3) : _
  963.              CALL BRKFNAME (FMS.DIRECTORY$,DR$,Y$,X$,FALSE) : _
  964.              B$(3) = Y$ : _
  965.              TIME.LOCK.EXEMPT = TRUE : _
  966.              GOSUB 20185 : _
  967.              TIME.LOCK.EXEMPT = FALSE
  968. 852 STOP.INTERRUPTS = FALSE
  969.     SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)    ' KP101105
  970.     IF USER.SECURITY.LEVEL < OPT.SEC (2) OR _
  971.        ACTIVE.BULLETINS < 1 OR _
  972.        SYSOP OR _
  973.        SAME.USER THEN _
  974.           GOTO 900
  975.     IF BULLETIN.MENU$ = BULLETIN.SAVE$ THEN _
  976.        GOTO 900
  977.     BULLETIN.SAVE$ = BULLETIN.MENU$
  978. 855 CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  979.     IF BULLETINS.OPTIONAL AND NOT NEW.USER THEN _
  980.        GOTO 856
  981.     STOP.INTERRUPTS = TRUE
  982.     NEW.USER = FALSE
  983.     GOSUB 9700
  984.     STOP.INTERRUPTS = FALSE
  985.     GOTO 900
  986. 856 IF NOT CHECK.BULLETIN.LOGON THEN _
  987.        ANS.INDEX = 0 : _
  988.        GOSUB 9760 : _
  989.        GOTO 900
  990.     CALL SKIPLINE (1)
  991.     A$ = "Skip the  bulletins (Y,[N])"
  992.     GOSUB 12999
  993.     IF YES THEN _
  994.        GOTO 900
  995. 860 NEW.USER = FALSE
  996.     GOSUB 9700
  997. 900 NEW.USER = FALSE
  998.     ACTION.FLAG = (LOGON.MAIL.LEVEL$ = "S")
  999.     LOGON.MAIL.NEW = (LOGON.MAIL.LEVEL$ = "N")
  1000.     GOSUB 1895
  1001.     IF ACTIVE.USER.NAME$ = "SYSOP" AND NOT SYSOP THEN _
  1002.        ACTIVE.USER.NAME$ = ORIG.USER.NAME$
  1003.     LOGON.MAIL.NEW = FALSE
  1004.     SUBROUTINE.PARAMETER = 2
  1005.     CALL LINE25
  1006.     SECTION$ = "    "
  1007.     A$ = ""
  1008.     IF (NOT CONFERENCE.MODE ) AND (NOT SUB.BOARD) AND NOT TURBO.LOGON THEN _
  1009.        GOSUB 5800
  1010.     Q! = MINUTES.IN.DOORS * 60                       ' KP101103
  1011.     EXIT.TO.DOORS = FALSE
  1012.     GOSUB 2350
  1013.     IF NOT PRIVATE.DOOR THEN _
  1014.        GOTO 955
  1015.     GOSUB 20165
  1016.     CALL SETSECT
  1017.     PRIVATE.DOOR = FALSE
  1018.     GOTO 1205
  1019. 955  IF NOT TURBO.LOGON THEN _     '<--- new                       ' KG110203
  1020.      GOSUB 4850 :_
  1021.  IF STR$(LAST.MESSAGE.READ) < STR$(HIGH.MESSAGE.NUMBER) AND USER.SECURITY.LEVEL => MESSAGE.SECURITY THEN _    'Pe 01/29/89
  1022.      GOSUB 4275                                 'PEASKMAIL
  1023.     TURBO.LOGON = FALSE
  1024. '
  1025. '
  1026. ' *                           COMMAND PROCESSING                              *
  1027. '
  1028. 1200 CLOSE 1
  1029.      GOSUB 1280
  1030. 1205 SUBROUTINE.PARAMETER = 1
  1031.      STOP.INTERRUPTS = FALSE
  1032.      NON.STOP = FALSE
  1033.      Q = 0
  1034. '* ------[ first line different ]------
  1035.      IF HOME.CONFERENCE$ <> "" THEN                               'DGS-TTMMOD
  1036.     TURBO.LOGON = TRUE                                        'DGS-TTMMOD
  1037.     IF LEFT$(HOME.CONFERENCE$,1) = "*" THEN                   'DGS-TTM
  1038.        HOME.CONFERENCE$ = MID$(HOME.CONFERENCE$,2)            'DGS-TTM
  1039.        Q = NUM.OF.TC                                          'DGS-TTMC
  1040.        B$(4) = HOME.CONFERENCE$                               'DGS-TTC
  1041.        TEMP.COMM.STACK$ = COMMPORT.STACK$                     'DGS-TTC
  1042.        FOR COUNT = 1 TO NUM.OF.TC                             'DGS-TTC
  1043.           CALL CHKMACRO (B$(COUNT+3),FOUND)                   'DGS-TTC
  1044.           TEMP.COMM.STACK$ = (TEMP.COMM.STACK$ + _            'DGS-TTC
  1045.                   B$(COUNT+3) + CARRIAGE.RETURN$)     'DGS-TTC
  1046.           IF FOUND THEN                                       'DGS-TTC
  1047.          HOME.CONFERENCE$ = ""                            'DGS-TTC
  1048.          TEMP.COMM.STACK$ = (TEMP.COMM.STACK$ + Y$)       'DGS-TTC
  1049.           END IF                                              'DGS-TTC
  1050.        NEXT COUNT                                             'DGS-TTC
  1051.        B$(1) = HOME.CONFERENCE$                               'DGS-TTC
  1052.        COMMPORT.STACK$ = TEMP.COMM.STACK$                     'DGS-TTC
  1053.        B$(2) = ""                                             'DGS-TTC
  1054.        HOME.CONFERENCE$ = ""                                  'DGS-TTM
  1055.        GOTO 1235                                              'DGS-TTM
  1056.     ELSE                                                      'DGS-TTD
  1057.        IF LEFT$(HOME.CONFERENCE$,1) = "#" THEN                'DGS-TTD
  1058.           FF = 4                                              'DGS-TTD
  1059.           B$(2) = MID$(HOME.CONFERENCE$,2)                    'DGS-TTD
  1060.           HOME.CONFERENCE$ = ""                               'DGS-TTD
  1061.           Q = 2                                               'DGS-TTD
  1062.           GOTO 1240                                           'DGS-TTD
  1063.        ELSE FF = 8                                            'DGS-TTDMOD
  1064.           B$(2) = HOME.CONFERENCE$                            'DGS-TTDMOD
  1065.           HOME.CONFERENCE$ = ""                               'DGS-TTDMOD
  1066.           Q = 2                                               'DGS-TTDMOD
  1067.           GOTO 1240                                           'DGS-TTDMOD
  1068.        END IF
  1069.     END IF
  1070.      END IF
  1071.      CALL SKIPLINE (1)
  1072.  
  1073. 1210 GOSUB 41000
  1074.      'CALL DISPLAYTR (TIME.REMAINING!)
  1075.      IF EXPERT.USER THEN _
  1076.         GOTO 1230
  1077. 1212 LINES.PRINTED = -MENUS.CAN.PAUSE * LINES.PRINTED
  1078.      IF CUSTOM.PUI THEN _
  1079.         GOTO 1230
  1080.      IF SUB.SECTION < BEG.FILE THEN _
  1081.         IF USER.SECURITY.LEVEL >= SYSOP.MENU.SECURITY.LEVEL THEN _ ' KG120402
  1082.            FILE.NAME$ = MENU$(1) : _
  1083.            GOSUB 43025
  1084.      FILE.NAME$ = MENU$(MENU.INDEX)
  1085.      DELETE.INVALID = TRUE
  1086.      GOSUB 43025
  1087.      DELETE.INVALID = FALSE
  1088. 1230 CALL LINE25
  1089.      CALL SKIPLINE (1)
  1090.      IF CONFERENCE.MODE THEN _
  1091.         A$ = GRN$ : _
  1092.         GOSUB 12979
  1093.      IF CUSTOM.PUI THEN _
  1094.         CALL USERFACE (USER.GRAPHIC.DEFAULT$) : _
  1095.         GOSUB 12997 : _
  1096.         GOTO 1235
  1097.      IF MENU.INDEX = 6 THEN _
  1098.         SUBROUTINE.PARAMETER = 1 : _
  1099.         CALL LIBRARY
  1100.      GOSUB 41000
  1101.      CALL DISPLAYTR (TIME.REMAINING!)             'Pe time mod
  1102.      A$ = COMMAND.PROMPT$
  1103.      TURBO.LOGON = FALSE                          ' KP101106
  1104.      GOSUB 12999
  1105.      IF Q = 0 THEN _
  1106.         GOTO 1230
  1107. 1235 Z$ = B$(1)
  1108.      IF LEN(Z$) < 1 THEN _
  1109.         GOTO 1230
  1110.       CALL SRCHCMND (SUB.SECTION,FF)
  1111.      IF FF < 1 THEN _
  1112.         CALL QTPUT (CX$(1)+"Unknown"+fg.3$+" command"+EMPHASIZE.OFF$+" <"+Z$+">",1) : _
  1113.         GOTO 1230
  1114. 1240 IF USER.SECURITY.LEVEL < OPT.SEC(FF) THEN _
  1115.         VIOLATION$ = SECTION$ + _
  1116.                      " " + _
  1117.                      Z$ : _
  1118.         GOSUB 1380 : _
  1119.         GOTO 1205
  1120.      IF FF > 39 THEN _
  1121.         DIRECTORY.EXTENTION$ = LIBRARY.DIRECTORY.EXTENTION$ _
  1122.      ELSE DIRECTORY.EXTENTION$ = MAIN.DIRECTORY.EXTENTION$     'Pe 03/22/89
  1123.      LAST.INDEX = Q
  1124.      ANS.INDEX = 1 - (LAST.INDEX > 1)
  1125.      CALL QTPUT (CHR$(12),1)                           'PE  CLS Mod
  1126.         ON FF GOSUB _
  1127.                  1400, _      ' 1  A)nswer questionnaire 1
  1128.                  9700, _      ' 2  B)ulletins
  1129.                  1800, _      ' 3  C)omments
  1130.                  10970, _     ' 4  D)oor (exit to)
  1131.                  2000, _      ' 5  E)nter a message
  1132.                  1275, _      ' 6  F)ile system (exit to)
  1133.                  1525, _      ' 7  I)nitial welcome redisplayed 'Pe 04/01/89
  1134.                  5300, _      ' 8  J)oin a conference
  1135.                  3900, _      ' 9  K)ill a message
  1136.                  4700, _      '10  O)perator page
  1137.                  1892, _      '11  P)ersonal mail (look for) 'Pe 02/11/89
  1138.                  4330, _      '12  R)ead messages
  1139.                  4340, _      '13  S)can message headers
  1140.                  4320, _      '14  T)opic msg scan
  1141.                  1285, _      '15  U)tilities (exit to)
  1142.                  5800, _      '16  V)iew a conference
  1143.                  9800, _      '17  W)ho's on other nodes displayed
  1144.                  1283, _      '18  @)Library (exit to) 18
  1145.                 20160, _      '19  D)ownload
  1146.                 10570, _      '20  G)oodbye
  1147.                 20155, _      '21  L)ist
  1148.                 20185, _      '22  N)ew
  1149.                 20180, _      '23  P)ersonal files
  1150.                 20175, _      '24  S)can
  1151.                 20170, _      '25  U)pload
  1152.                 20140, _      '26  V)iew ARC Contents
  1153.                  5500, _      '27  B)aud rate change.... removed pe 04/06/89
  1154.                  9099, _      '28  C)lock (time & time on) 'Pe 02/11/89
  1155.                  42850, _     '29  E)cho selection
  1156.                  42800, _     '30  F)ile transfer protocol
  1157.                  43000, _     '31  G)raphics
  1158.                  5200, _      '32  L)ines per page
  1159.                  10925, _     '33  M)essage margin
  1160.                  5110, _      '34  P)assword change
  1161.                  5450, _      '35  R)eview preferences
  1162.                  4849, _      '36  S)tatistics displayed  'Pe 02/10/89
  1163.                  1500, _      '37  T)oggle
  1164.                  10090, _     '38  U)serlog displayed 12
  1165.                  30000, _     '39  A)rchive a Library disk 1
  1166.                  30100, _     '40  C)hange a Library disk
  1167.                  30200, _     '41  D)ownload Library files
  1168.                  10570, _     '42  G)oodbye
  1169.                  20155, _     '43  L)ist a Library directory
  1170.                  20175, _     '44  S)can a Library disk directory
  1171.                  20140, _     '45  V)iew arc contents 7
  1172.                  1325, _      '45  H)elp 1
  1173.                  1330, _      '46  ?)help
  1174.                  1250, _      '49  Q)uit
  1175.                  4240, _      '50  X)expert toggle on/off 4
  1176.                  10070, _     '51  1) List comments file 1
  1177.                  10090, _     '52  2) List callers file
  1178.                  10390, _     '53  3) Recover a message
  1179.                  10530, _     '54  4) Erase comments
  1180.                  11000, _     '55  5) User file maintenance
  1181.                   4130, _     '56  6) Toggle page bell on/off
  1182.                  10930        '57  7) Exit to DOS 2.x or above 7
  1183.      GOTO 1205
  1184. '
  1185. ' ****           QUIT COMMAND (GLOBAL)              ****
  1186. '
  1187. 1250 IF Q > 1 THEN _
  1188.         ANS.INDEX = 2: _
  1189.         GOTO 1270
  1190. 1260 ANS.INDEX = 1
  1191.      IF EXPERT.USER THEN _
  1192.         A$ = QUIT.PROMPT.EXPERT$ _
  1193.      ELSE A$ = QUIT.PROMPT.NOVICE$
  1194.      GOSUB 12999
  1195.      IF Q = 0 THEN _
  1196.         Q = 1: _
  1197.         B$(1) = "M"
  1198. 1270 Z$ = B$(ANS.INDEX)
  1199.      CALL ALLCAPS (Z$)
  1200.      IF Z$ = "C" THEN _
  1201.         Z$ = "M" : _
  1202.         GOTO 5323
  1203.      IF Z$ <> SPACE$(LEN(Z$)) THEN _                                 ' KG102706
  1204.      ON INSTR(QUIT.LIST$,Z$) GOTO 1275,1280,1285,10570,1283
  1205.      GOTO 1260
  1206. 1275 MENU.INDEX = 3
  1207.      GOTO 1295
  1208. 1280 MENU.INDEX = 2
  1209.      GOTO 1295
  1210. 1283 MENU.INDEX = 6
  1211.      ACTIVE.FMS.DIRECTORY$ = ""
  1212.       GOTO 1295
  1213. 1285 MENU.INDEX = 4
  1214. 1295 CALL SETSECT
  1215.      RETURN
  1216. 1300 CALL QTPUT (FG.1$+"Message base "+FG.2$ + GRN$,1)
  1217.      RETURN
  1218. '
  1219. ' **** COMMON LOCAL DISPLAY PRINT  ****
  1220. '
  1221. 1315 NUM.RETURNS = 1
  1222. 1320 CALL LPRNT(D$,NUM.RETURNS)
  1223.      RETURN
  1224. '
  1225. ' ******            HELP (GLOBAL)           *****
  1226. '
  1227. 1325 CALL VIEWHELP (SUB.SECTION,USER.GRAPHIC.DEFAULT$, _
  1228.                 MID$("MAINFILEUTILMAINLIBR",4 * MENU.INDEX - 7,4))
  1229.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1230.         RETURN 10595
  1231.      RETURN
  1232. 1330 IF EXPERT.USER THEN _
  1233.         RETURN 1212
  1234.      GOTO 1325
  1235. '
  1236. ' *****  RECORD SECURITY VIOLATIONS   *****
  1237. '
  1238. 1380 CALL SVIOLATION
  1239.      IF NOT DENY.ACCESS THEN _
  1240.         RETURN
  1241. 1386 CALL DENYACCESS
  1242.      GOTO 10620
  1243. 1397 A$ = CX$(1)+"Sorry, " + _
  1244.         FG.2$+  FIRST.NAME$+EMPHASIZE.OFF$ + _
  1245.           ", " + _
  1246.           A$
  1247.      GOTO 12975            'KG102503
  1248. '
  1249. ' ***  END KEY - FORCE CURRENT USER OFF AND LOCK THEM OUT  ***
  1250. '
  1251. 1400 A1$ = ANS.MENU$
  1252. 1401 CALL SUBMENU ("Which questionnaire(s), L)ist" + PRESS.ENTER.EXPERT$, _
  1253.     A1$,QUES.PATH$,".DEF","",USER.GRAPHIC.DEFAULT$,TRUE,FALSE,TRUE,"")'KG120501
  1254.      IF Q = 0 THEN _
  1255.         RETURN
  1256.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1257.         RETURN 10595
  1258.      QUESTIONNAIRE.HOLD$ = Z$
  1259.      GOSUB 11520
  1260.      CLOSE 2
  1261.      CALL UPDTCALR (QUESTIONNAIRE.HOLD$ + " questionnaire " + _
  1262.         MID$("answeredaborted",1 - 8 * QUESTIONNAIRE.ABORTED,8),2)
  1263.      ANS.INDEX = ANS.INDEX + 1
  1264.      IF ANS.INDEX > LAST.INDEX THEN _
  1265.         ANS.INDEX = 0
  1266.      GOTO 1401
  1267. '
  1268. ' *****    TOGGLE COMMAND (UTILITIES)     *****
  1269. '
  1270. 1500 IF Q > 1 THEN _
  1271.         ANS.INDEX = 2 : _
  1272.         LAST.INDEX = Q : _
  1273.         GOTO 1510
  1274. 1502 ANS.INDEX = 1
  1275.      A$ = "A)utodwnld   B)ullet  C)ase     F)ile   H)ilite"
  1276.      CALL COLORPMT (A$)
  1277.      CALL QTPUT (A$,1)
  1278.      A$ = "L)ine feeds  N)ulls   T)urboKey X)pert  !)bell"
  1279.      CALL COLORPMT (A$)
  1280.      CALL QTPUT (A$,1)
  1281.      A$ = "TOGGLE which options on/off?" + PRESS.ENTER$
  1282.      GOSUB 12999
  1283.      IF Q=0 THEN _
  1284.         RETURN
  1285.      LAST.INDEX = Q
  1286. 1510 Z$ = B$(ANS.INDEX)
  1287.      CALL ALLCAPS (Z$)
  1288.      FF = INSTR("ABCFHLNTX!",Z$)
  1289.      IF FF < 1 THEN _
  1290.         GOTO 1502
  1291.      CALL TOGGLE (FF)
  1292.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1293.         GOTO 202
  1294.      ANS.INDEX = ANS.INDEX + 1
  1295.      IF ANS.INDEX > LAST.INDEX THEN _
  1296.         GOTO 1502
  1297.       GOTO 1510
  1298. '
  1299. ' ****  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)  ****
  1300. 1525 CALL SKIPLINE(2)
  1301.      CALL QTPUT(FG.1$+"Review System Screens Available:",1)
  1302.      CALL QTPUT(FG.4$+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",2)
  1303.      CALL QTPUT(FG.2$+"P)relog Screen",1)
  1304.      CALL QTPUT(FG.3$+"W)elcome Screen",1)
  1305.      CALL QTPUT(FG.4$+"O)nline News Screens",1)
  1306.      CALL QTPUT(FG.1$+"Y)our Access Level",1)
  1307.      CALL QTPUT(FG.2$+"N)ew User Sign-On",1)
  1308.      CALL QTPUT(CX$(1)+"[Q]uit"+EMPHASIZE.OFF$,2)
  1309. A$ = "Please make a Selection (P,W,O,Y,N,[Q]) "
  1310.         SUBROUTINE.PARAMETER = 1
  1311.         TURBO.KEY = -TURBO.KEY.USER
  1312.         CALL TGET
  1313.         CALL ALLCAPS (B$)
  1314.         X = INSTR("PWOYNQ",B$)
  1315.         IF B$ = "" THEN _
  1316.            GOTO 1596
  1317.     ON X GOTO 1530,1533,1536,1539,1541,1596
  1318. 1530 FILE.NAME$ = PRELOG$
  1319.      GOTO 1550
  1320. 1533 FILE.NAME$ = WELCOME.FILE$
  1321.      GOTO 1550  
  1322. 1536 FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  1323.     "NEWS.DEF"
  1324.      GOTO 1550
  1325. 1539 GOSUB 465 
  1326.      GOTO 1525
  1327. 1541 FILE.NAME$ = NEWUSER.FILE$
  1328. 1550 GOSUB 1790
  1329.      CALL ASKMORE ("",TRUE,FALSE,X,TRUE)
  1330.      GOTO 1525
  1331. 1596 RETURN
  1332. '
  1333. 1790 CALL GRAPHIC (USER.GRAPHIC.DEFAULT$)
  1334.      CALL BUFFILE (FILE.NAME$,X)
  1335.      CALL CARRIER
  1336.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1337.         RETURN 10595
  1338.      RETURN
  1339. '
  1340. ' ***  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)   ***
  1341. '
  1342. 1800 MESSAGE.TO$ = "SYSOP"
  1343.      SUBJECT$ = "COMMENT"
  1344.      GOSUB 1893
  1345.      IF (ACTIVE.MESSAGES >= MAXIMUM.MESSAGES OR _
  1346.          NEXT.MESSAGE.RECORD + 5 > HIGHEST.MESSAGE.RECORD OR _
  1347.          NOT COMMENTS.AS.MESSAGES ) THEN _
  1348.  A$ = "Want a REPLY?  Use "+ _
  1349.        MID$(ALL.OPTS$,5,1)+" instead.  Leave a comment? (Y/[N])" :_
  1350.   GOSUB 12999 : _
  1351.         IF NOT YES THEN _
  1352.            CALL SKIPLINE (1) : _
  1353.            RETURN _
  1354.         ELSE SYSOP.COMMENT = TRUE : _
  1355.              GOTO 2007
  1356.      SYSOP.COMMENT = FALSE
  1357.      SYSOP.MESSAGE = TRUE
  1358.      FT$ = "comment"
  1359.      GOTO 2010
  1360. 1850 BX = &H3
  1361.      EN$ = COMMENTS.FILE$
  1362.      GOSUB 12992
  1363.      CALL OPENWRKA (COMMENTS.FILE$)
  1364.      A$ = FG.1$+FIRST.NAME$+FG.2$ + _
  1365.           ", Thanks for comments!"
  1366.      GOSUB 12976
  1367.      SUBROUTINE.PARAMETER = 2
  1368.      CALL AMORPM
  1369.      CALL PRNTWRKA (ACTIVE.USER.NAME$+" "+CURRENT.DATE$+" "+TIM$+" Node "+NODE.ID$)
  1370.      FOR X = 1 TO LINES.IN.MESSAGE
  1371.         CALL PRNTWRKA (A$(X))
  1372.      NEXT
  1373.      CALL PRNTWRKA (CARRIAGE.RETURN$)
  1374.      CLOSE 2
  1375.      IF EC <> 0 THEN _
  1376.         EL = 1850 : _
  1377.         GOTO 13000
  1378.      BX = &H3
  1379.      EN$ = COMMENTS.FILE$
  1380.      GOSUB 12993
  1381.      CALL UPDTCALR ("Left comment",1)
  1382.      REDIM A$(ADIM)
  1383.    IF LOGOFF$ = "G" THEN 10562           'Pe 02/04/89
  1384.      RETURN
  1385. '
  1386. ' ****  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)  *****
  1387. '
  1388. 1892 GOSUB 1900                            'Pe 02/11/89
  1389.      CALL ASKMORE ("",TRUE,FALSE,X,TRUE)   'Pe 02/11/89
  1390.      RETURN                                'Pe 02/11/89
  1391. '
  1392. '
  1393. 1893 ACTION.FLAG = TRUE
  1394.      GOTO 1897
  1395. 1895 IF TURBO.LOGON THEN _
  1396.         RETURN
  1397.      B$(0) = LEFT$("NEW ",-4*LOGON.MAIL.NEW)
  1398. 1897 IF ACTIVE.MESSAGE.FILE$ = PREV.BASE$ THEN _
  1399.         ACTION.FLAG = FALSE : _
  1400.         RETURN
  1401. 1900 GOSUB 5344
  1402.      IF PRIVATE.DOOR THEN _
  1403.         ACTION.FLAG = TRUE
  1404.      PREV.BASE$ = ACTIVE.MESSAGE.FILE$
  1405.      SHOW.ACTIVE = FALSE
  1406.      IF NOT ACTION.FLAG THEN _
  1407.         CALL QTPUT (FG.4$+"Checking "+FG.3$+" messages in "+EMPHASIZE.OFF$ + GRN.NAME$,0) : _
  1408.         SHOW.ACTIVE = TRUE _
  1409.      ELSE CALL QTPUT (CX$(1)+"Loading messages"+EMPHASIZE.OFF$,0) : _
  1410.           FOR I = 1 TO Q: _
  1411.              A$(I) = B$(I) : _
  1412.           NEXT
  1413.      I = 0
  1414.      MESSAGES.FROM.USER = FALSE
  1415.      ACTIVE.MESSAGES = 0
  1416.      MAIL.REPORTED = ACTION.FLAG
  1417.      FIRST.OLD = TRUE
  1418.      GOSUB 23000
  1419.      MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  1420.      ACTIVE.DELAY! = 0
  1421.      MAXIMUM.MESSAGES = VAL(MID$(MESSAGE.RECORD$,89,7))
  1422.      IF MAXIMUM.MESSAGES > MM THEN _
  1423.         MAXIMUM.MESSAGES = MM
  1424.      REDIM M(MAXIMUM.MESSAGES,2)
  1425.      NUM.DOTS = 0
  1426. 1905 GET 1,MESSAGE.RECORD
  1427.      CALL CHECKINT (MID$(MESSAGE.RECORD$,117,4))
  1428.      IF EC <> 0 THEN _
  1429.         EL = 1905 : _
  1430.         GOTO 13000
  1431.      NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,117,4))
  1432.      IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  1433.         NUMBER.RECORDS.IN.MESSAGE = 1
  1434. 1906 IF ACTION.FLAG OR (FIRST.OLD AND NOT MAIL.REPORTED) THEN _
  1435.         CALL MARKTIME (NUM.DOTS)
  1436.      CALL CARRIER
  1437.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1438.         RETURN 10595
  1439. 1910 IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  1440.         LOW.MESSAGE.NUMBER = M(1,2) : _
  1441.         GOTO 1950
  1442. 1915 IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ OR _
  1443.         MID$(MESSAGE.RECORD$,116,1) <> ACTIVE.MESSAGE$ THEN _
  1444.         GOTO 1946
  1445.      X$ = MID$(MESSAGE.RECORD$,121,2)
  1446.      IF X$ <> "  " THEN _
  1447.         IF CVI(X$) > USER.SECURITY.LEVEL THEN _
  1448.            GOTO 1945
  1449.      IF ACTION.FLAG THEN _
  1450.         GOTO 1935
  1451. '
  1452. ' ** ALLOW USERS WITH NAMES LONGER THAN 22 CHARS TO RECEIVE PRIVATE MAIL **
  1453. '
  1454. 1920 X$ = MID$(MESSAGE.RECORD$,37,22)
  1455.      IF INSTR(X$,MESSAGE.USER.NAME$) OR _
  1456.     (INSTR(ACTIVE.USER.NAME$,CHR$(32)) > 1 AND _              'DGS-ALS
  1457.      INSTR(X$,LEFT$(ACTIVE.USER.NAME$,22))) OR _              'DGS-ALS
  1458.         (SYSOP AND INSTR(X$,"SYSOP")) OR _
  1459.         (SYSOP AND INSTR(X$,SYSOP.FULL.NAME$)) THEN _
  1460.         GOTO 1925
  1461.      GOTO 1935
  1462. 1925 A = VAL(MID$(MESSAGE.RECORD$,2,4))
  1463.      IF LOGON.MAIL.NEW THEN _
  1464.         IF A <= LAST.MESSAGE.READ THEN _
  1465.            GOTO 1935
  1466.      IF NOT SHOW.ACTIVE THEN _
  1467.         GOTO 1930
  1468.      MAIL.REPORTED = TRUE
  1469.      FIRST.NEW = (A > LAST.MESSAGE.READ)
  1470.      IF FIRST.NEW THEN _
  1471.         I = 0 : _
  1472.         CALL SKIPLINE (1) : _
  1473. CALL QTPUT(CHR$(7)+CX$(1)+"NEW"+FG.2$+" Mail for YOU"+FG.1$+" (* = Private)"+EMPHASIZE.OFF$,1) _
  1474.      ELSE IF FIRST.OLD THEN _
  1475.              CALL SKIPLINE (1) : _
  1476.              CALL QTPUT (CHR$(7)+FG.1$+"OLD"+FG.2$+" Mail for YOU (* = Private)"+EMPHASIZE.OFF$,1) : _
  1477.              FIRST.OLD = FALSE
  1478.      SHOW.ACTIVE = NOT FIRST.NEW
  1479. 1930 CALL QTPUT (LEFT$(MESSAGE.RECORD$,5),0)
  1480.      I = I + 1
  1481.      IF I MOD 15 = 0 THEN _
  1482.         CALL SKIPLINE (1)
  1483. 1935 IF INSTR(MID$(MESSAGE.RECORD$,6,31),ACTIVE.USER.NAME$) OR _
  1484.     (INSTR(ORIG.USER.NAME$,CHR$(32)) > 1 AND _                 'DGS-ALS
  1485.      INSTR(MID$(MESSAGE.RECORD$,6,31),ORIG.USER.NAME$)) OR _   'DGS-ALS
  1486.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),"SYSOP")) OR _
  1487.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1488.         GOTO 1940
  1489.      GOTO 1945
  1490. 1940 IF MESSAGES.FROM.USER < ADIM THEN _
  1491.         MESSAGES.FROM.USER = MESSAGES.FROM.USER + 1 : _
  1492.         B$(MESSAGES.FROM.USER) = LEFT$(MESSAGE.RECORD$,5)
  1493. 1945 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1494.      M(ACTIVE.MESSAGES,1) = MESSAGE.RECORD
  1495.      M(ACTIVE.MESSAGES,2) = VAL(MID$(MESSAGE.RECORD$,2,4))
  1496. 1946 MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE
  1497.      GOTO 1905
  1498. 1950 IF NOT MAIL.REPORTED THEN _
  1499.         A$ = CX$(1)+"Sorry, "+FG.2$ + _
  1500.              FIRST.NAME$ +FG.1$+ _
  1501.              ", NO "+FG.3$ + B$(0) +EMPHASIZE.OFF$+ "MAIL for you" : _
  1502.         GOSUB 12975
  1503.      IF MESSAGES.FROM.USER = 0 OR NOT MESSAGE.REMINDER THEN _
  1504.         GOTO 1961
  1505.      IF ACTION.FLAG THEN _
  1506.         GOTO 1961
  1507.      A$ =FG.2$+ "Mail you left"
  1508.      GOSUB 12976
  1509. 1960 FOR I = 1 TO MESSAGES.FROM.USER
  1510.         A$ = B$(I)
  1511.         GOSUB 12978
  1512.         IF I MOD 15 = 0 THEN _
  1513.            CALL SKIPLINE (1)
  1514.      NEXT
  1515.      CALL SKIPLINE (1)
  1516. CALL QTPUT(FG.1$+"Please"+FG.3$+" <K>ill"+FG.2$+" old/unneeded messages"+EMPHASIZE.OFF$,1)
  1517. 1961 REDIM B$(ADIM)
  1518.      IF ACTION.FLAG THEN _
  1519.         ACTION.FLAG = FALSE : _
  1520.         FOR I = 1 TO Q : _
  1521.             B$(I) = A$(I) : _
  1522.             A$(I) = "" : _
  1523.         NEXT
  1524.      CALL SKIPLINE (1)
  1525.      RETURN
  1526. '
  1527. ' ****  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)  ****
  1528. '
  1529. 2000 IF LOW.MESSAGE.NUMBER > 0 AND _
  1530.         ACTIVE.MESSAGES = MAXIMUM.MESSAGES THEN _
  1531.         IF ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ AND _
  1532.            ACTIVE.MESSAGES = 1 THEN _
  1533.            GOTO 5300 _
  1534.         ELSE A$ = "No room for new messages!  Try tomorrow" : _
  1535.              GOSUB 12975 : _
  1536.              GOTO 3650
  1537. 2006 MESSAGE.PASSWORD$ = ""
  1538.      SYSOP.COMMENT = FALSE
  1539.      IF RE.EDIT = TRUE THEN _                    'BK012301
  1540.     GOTO 2007                        'BK012301
  1541.      IF NOT REPLY THEN _
  1542.         MESSAGE.TO$ = ""
  1543. 2007 IF SYSOP.COMMENT THEN _
  1544.         Z$ = COMMENTS.FILE$ : _
  1545.         FT$ = "comment" _
  1546.      ELSE Z$ = ACTIVE.MESSAGE.FILE$ : _
  1547.           FT$ = "message"
  1548. 2008 IF SYSOP.COMMENT THEN _
  1549.         CALL FINDFREE : _
  1550.         GOTO 2009
  1551.      FREE.SPACE$ = "2000"
  1552.      IF NEXT.MESSAGE.RECORD + 3 >= HIGHEST.MESSAGE.RECORD THEN _
  1553.         FREE.SPACE$ = "1"
  1554. 2009 IF VAL(FREE.SPACE$) < 2000 THEN _
  1555.         A$ = "No room for " + _
  1556.              FT$ : _
  1557.         GOSUB 12979 : _
  1558.         GOTO 3650
  1559.      IF QUOTED.REPLY = TRUE OR _                'BK012301
  1560.     RE.EDIT = TRUE THEN _                    'BK012301
  1561.         GOTO 2013                        'BK010501
  1562. 2010 LINES.IN.MESSAGE = 0
  1563.      COMMPORT.STACK$ = ""
  1564.      L = 0
  1565.      X = 0
  1566.      REDIM A$(ADIM)
  1567. 2013 IF GET.EXT.DESC THEN _                                    'BK010501
  1568.         GOTO 2100
  1569.      GOSUB 1893
  1570.      RECEIVER.RECORD.NUM = 0                                         ' KG010401
  1571. 2020 CALL MSGTO (HIGHEST.USER.RECORD,MESSAGE.TO$,RECEIVER.RECORD.NUM,FOUND)
  1572.      IF SYSOP.COMMENT THEN _                                         ' KG010401
  1573.         GOTO 2100                                                    ' KG010401
  1574.      IF SYSOP.MESSAGE THEN _                                         ' KG010401
  1575.         SYSOP.MESSAGE = FALSE : _                                    ' KG010401
  1576.         MESSAGE.PASSWORD$ = "^READ^" : _                             ' KG010401
  1577.         GOTO 2100                                                    ' KG010401
  1578.      IF REPLY THEN _
  1579.         FOUND = TRUE : _
  1580.         CALL TRIM (MESSAGE.TO$):  _
  1581.         GOTO 2035 _
  1582.      ELSE SUBJECT$ = ""
  1583.      IF RE.EDIT = TRUE THEN _                    'BK012201
  1584.     SUBJECT$ = SUBJECT.OLD$                    'BK012201
  1585.      IF MESSAGE.TO$ = "" THEN _
  1586.         RETURN
  1587.      GOSUB 2065
  1588. 2035 CALL MSGPROT (MESSAGE.TO$,FOUND,MESSAGE.PASSWORD$)
  1589.      IF RE.EDIT = TRUE THEN _                    'BK012201
  1590.         RETURN                            'BK012201
  1591.      IF MESSAGE.PASSWORD$ = "" THEN _
  1592.         GOTO 2020
  1593.      IF QUOTED.REPLY = TRUE THEN _                'BK010501
  1594.         RETURN                            'BK010501
  1595.      GOTO 2100
  1596. '
  1597. ' *****  SET/CHANGE SUBJECT FOR A MESSAGE   ****
  1598. '
  1599. 2065 IF SUBJECT$ <> "" THEN _
  1600.         A$ = "SUBJECT: (Enter for " + _                    'BK010501
  1601.              SUBJECT$ + _                                  'BK010501
  1602.              ")" : _
  1603.         GOSUB 12995 _
  1604.      ELSE A$ = "Subject" : _
  1605.           GOSUB 12998
  1606.      IF LEN(B$) > 25 THEN _
  1607.         A$ = "25 Char. Max" : _
  1608.         GOSUB 12979 : _
  1609.         GOTO 2065
  1610.      IF Q = 0 THEN _
  1611.         IF SUBJECT$ <> "" THEN _
  1612.            RETURN _
  1613.         ELSE GOSUB 2435 : _
  1614.              IF YES THEN _
  1615.                 RETURN 5160 _
  1616.              ELSE GOTO 2065
  1617.      SUBJECT$ = B$
  1618.      CALL ALLCAPS (SUBJECT$)
  1619.      RETURN
  1620. '
  1621. ' *****  ENTER MAIN BODY OF MESSAGE  *****
  1622. '
  1623. 2100 A$ =FG.1$+ "Type "+FG.2$ + _
  1624.           FT$ + _
  1625.        FG.3$+   STR$(MAX.MESSAGE.LINES) + _
  1626.           " lines max" + _
  1627.           PRESS.ENTER$ + EMPHASIZE.OFF$
  1628.      GOSUB 12975
  1629.      GOSUB 3200
  1630. 2125 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1631. 2127 IF REMOTE.ECHO OR LOCAL.USER THEN _
  1632.         A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + _
  1633.              ": " + _
  1634.              A$(LINES.IN.MESSAGE) _
  1635.      ELSE A$ = A$(LINES.IN.MESSAGE)
  1636.      GOSUB 12978
  1637.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN + 1)
  1638.      IF WAIT.EXPIRED THEN _
  1639.         GOTO 10590 _
  1640.      ELSE IF SUBROUTINE.PARAMETER = -1 THEN _
  1641.              GOTO 10595
  1642.      CALL FINDFUNC
  1643.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1644.         GOTO 202
  1645.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1646.         LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _
  1647.         GOTO 2300
  1648. 2140 J = LINES.IN.MESSAGE
  1649.      GOSUB 2200
  1650.      IF X THEN _
  1651.         GOTO 2300
  1652.      GOTO 2125
  1653. 2200 X = 0
  1654.      IF J < (MAX.MESSAGE.LINES - 2) THEN _
  1655.         RETURN
  1656.      A$ = MID$("2 lines leftLast line   Full",12 * (J-(MAX.MESSAGE.LINES - 2)) + 1,12)
  1657.      X = (J > (MAX.MESSAGE.LINES - 1))
  1658. 2210 GOSUB 12979
  1659.      RETURN
  1660. 2299 Z$ = "L"                            'BK010501
  1661.      L = 1                            'BK010501
  1662.      GOTO 2325                            'BK010501
  1663. '
  1664. ' *****  FINAL MESSAGE DISPOSITION   *****
  1665. '
  1666. 2300 CALL SKIPLINE (1)
  1667.      IF NOT EXPERT.USER THEN _
  1668.         CALL QTPUT ("A)bort," + LEFT$("B)tch Import,",-13 * (SYSOP OR LOCAL.USER)) + "C)ont,D)el,E)dit,I)nsert,L)ist,M)ar,R)ev subj,S)ave,P)hoto",1)
  1669. 2315 A$ = "Edit Sub-function <A," + _
  1670.           LEFT$("B,",-2 * (SYSOP OR LOCAL.USER)) + _
  1671.           "C,D,E,I,L,M,R,S,?,Photo>"                   'Pe Carbon
  1672.      CALL SKIPLINE (1)
  1673.      GOSUB 12999
  1674.      IF Q = 0 THEN _
  1675.         GOTO 2315
  1676.      CALL ALLCAPS (B$(1))
  1677.      Z$ = B$(1)
  1678.      CARBON$ = Z$                                         'Pe Carbon
  1679. 2325 IF Q > 1 AND Z$ <> "M" THEN _
  1680.         CALL CHECKINT (B$(Q)) : _
  1681.         IF EC <> 0 THEN _
  1682.            GOTO 2300 _
  1683.         ELSE L = TESTED.INTEGER.VALUE : _
  1684.              GOSUB 3320
  1685. 2330 ON INSTR("ABCDEILMRS?P",Z$) GOTO 2400,2335,2332,2500,2600,2800,3000,3100,2440,3400,2345,3400
  1686.      GOTO 2300
  1687. 2332 IF LINES.IN.MESSAGE < 1 THEN _
  1688.         LINES.IN.MESSAGE = 1
  1689.      GOTO 2127
  1690. 2335 X = LINES.IN.MESSAGE
  1691.      CALL MIMPORT (MAX.MESSAGE.LINES,RIGHT.MARGIN,LINES.IN.MESSAGE,A$())
  1692.      IF LINES.IN.MESSAGE > X THEN _
  1693.         GOTO 3000 _
  1694.      ELSE GOTO 2300
  1695. '
  1696. ' *****  DISPLAY MESSAGE SUBCOMMANDS HELP FILE   *****
  1697. '
  1698. 2345 FILE.NAME$ = HELP$(4)
  1699.      GOSUB 1790
  1700.      GOTO 2315
  1701. 2350 CALL FINDIT (MAIN.PUI$)
  1702.      CUSTOM.PUI = OK
  1703.      IF OK THEN _
  1704.         CURRENT.PUI$ = MAIN.PUI$ _
  1705.      ELSE CURRENT.PUI$ = ""
  1706.      RETURN
  1707. '
  1708. ' ****  ABORT MESSAGE   ****
  1709. '
  1710. 2400 GOSUB 2435
  1711.      IF NOT YES THEN _
  1712.         GOTO 2300
  1713. 2430 A$ = "Aborted"
  1714.      GOSUB 12975
  1715.      Z.ABORT = 1
  1716.      QUOTED.REPLY = FALSE                    'Pe 01/29/89
  1717.      RE.EDIT = FALSE                                            'Pe 02/11/89
  1718.      GOTO 3650
  1719. 2435 A$ = "Abort " + _
  1720.           FT$ + _
  1721.           " (Y/[N])"
  1722.      GOSUB 12995
  1723.      RETURN
  1724. '
  1725. ' *****  CHANGE SUBJECT OF A MESSAGE  *****
  1726. '
  1727. 2440 GOSUB 2065
  1728.      GOTO 2300
  1729. '
  1730. ' ***** BLOCK  DELETE MESSAGE LINE (S)  *****    'BK010401
  1731. '
  1732. 2500 CALL SKIPLINE (1)
  1733.      IF Q = 1 THEN _
  1734.         A$ = "Delete " : _     'BK012801
  1735.         GOSUB 12978 : _
  1736.         GOSUB 3300
  1737. 2520 MARK1 = L                                          'BK010401
  1738.      A$ = "Up to and including " : _                    'BK010401
  1739.      GOSUB 12978 : _                                    'BK010401
  1740.      GOSUB 3300                                         'BK010401
  1741.    IF MARK2 = 0 THEN _                        'BK012801
  1742.           MARK2 = L                                          'BK010401
  1743.      CALL SKIPLINE(1)                        'BK010401
  1744.      IF MARK1 > MARK2 THEN _                                'BK010401
  1745.         A$ = "Block BEGINNING exceeds END.  Block NOT deleted!" : _  'BK010401
  1746.         GOSUB 12979 : _                                 'BK010401
  1747.         GOTO 2555                                       'BK012801
  1748. 2530 IF MARK1 = MARK2 THEN _                    'BK012801
  1749.         A$ = "Delete line #" + STR$(MARK1) + " (Y/[N])" _    'BK012801
  1750.      ELSE _                             'BK012801
  1751.         A$ = "Delete lines" + STR$(MARK1) + " thru" + STR$(MARK2) + " (Y/[N])"'BK012801
  1752.      GOSUB 12999                        '*BK010401
  1753.      IF NOT YES THEN _
  1754.         A$ = "NOT Deleted" : _
  1755.         GOSUB 12979 : _
  1756.         GOTO 2555                        'BK012801
  1757. 2550 BLOCK.SIZE = (MARK2 - MARK1) + 1                'BK010401
  1758.      END.OF.BUFFER = LINES.IN.MESSAGE + 1            'BK010401
  1759.      LINES.IN.MESSAGE = LINES.IN.MESSAGE - BLOCK.SIZE       'BK010401
  1760.      FOR X = MARK1 TO LINES.IN.MESSAGE                      'BK010401
  1761.         A$(X) = A$(X + BLOCK.SIZE)                          'BK010401
  1762.      NEXT                                                   'BK010401
  1763.      FOR X = (LINES.IN.MESSAGE + 1) TO (END.OF.BUFFER)        'BK010401
  1764.     A$(X) = ""                            'BK010401
  1765.      NEXT                              'BK010401
  1766.      A$ = "Deleted" + STR$(BLOCK.SIZE) + " line(s)"            'BK012801
  1767.      GOSUB 12979
  1768. 2555 MARK1 = 0                            'BK012801
  1769.      MARK2 = 0                            'BK012801
  1770.      GOTO 2300
  1771. '
  1772. ' ****  EDIT MESSAGE LINE  ****
  1773. '
  1774. 2600 CALL SKIPLINE (1)
  1775.      IF Q = 1 THEN _
  1776.         GOSUB 3300
  1777.      CALL EDITALINE (L)
  1778.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1779.         GOTO 202
  1780.      GOTO 2300
  1781. 2800 IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES AND NOT SYSOP THEN _
  1782.         A$ = "Message full" : _
  1783.         GOSUB 12979 : _
  1784.         GOTO 2920
  1785. 2820 CALL SKIPLINE (1)
  1786.      IF Q = 1 THEN _
  1787.         A$ = "Before " : _
  1788.         GOSUB 12978 : _
  1789.         GOSUB 3300
  1790. 2830 LL = LINES.IN.MESSAGE
  1791.      K = LINES.IN.MESSAGE - L
  1792.      FOR X = L TO LINES.IN.MESSAGE
  1793.         B$(X + 1 - L) = A$(X)
  1794.         A$(X) = ""
  1795.      NEXT
  1796.      LINES.IN.MESSAGE = L
  1797. 2840 A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + _
  1798.           ": "
  1799.      GOSUB 12978
  1800.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN + 1)
  1801.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1802.         GOTO 2920
  1803. 2870 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1804.      J = LINES.IN.MESSAGE + K - 1
  1805.      GOSUB 2200
  1806.      IF NOT X THEN _
  1807.         GOTO 2840
  1808. 2920 FOR X = 1 TO K + 1
  1809.         A$(LINES.IN.MESSAGE + X - 1) = B$(X)
  1810.      NEXT
  1811.      REDIM B$(ADIM)
  1812.      LINES.IN.MESSAGE = LL + LINES.IN.MESSAGE - L
  1813.      GOTO 2300
  1814. '
  1815. ' *****  LIST MESSAGE CONTENTS   *****
  1816. '
  1817. 3000 STOP.INTERRUPTS = FALSE
  1818.      CALL SKIPLINE (1)
  1819.      IF Q = 1 THEN _
  1820.         L = 1 : _
  1821.         A$ = FG.3$ + "To: " + _
  1822.              MESSAGE.TO$ + _
  1823.              FG.4$ + " Re: " + _
  1824.      SUBJECT$  : _                        'Removed EMPHASIZE.OFF$ Pe 03/23/89
  1825.         GOSUB 12979 : _
  1826.         CALL QTPUT (MID$("    ",1,-4 * (NOT REMOTE.ECHO)),0) : _
  1827.         GOSUB 3200
  1828. 3020 FOR X = L TO LINES.IN.MESSAGE
  1829.         CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  1830.         IF NO OR RET THEN _
  1831.            X = LINES.IN.MESSAGE + 1 _
  1832.         ELSE A$ = RIGHT$(STR$(X),2) + _
  1833.                   ": " + _
  1834.                   A$(X) : _
  1835.              GOSUB 12979
  1836.      NEXT
  1837.      GOTO 2300
  1838. '
  1839. ' *****  CHANGE MARGIN WIDTH   *****
  1840. '
  1841. 3100 CALL SKIPLINE (1)
  1842.      IF Q <> 1 THEN _
  1843.         B$(1) = B$(Q) : _
  1844.         GOTO 3130
  1845. 3115 A$ = "SET Right-Margin from" + _
  1846.           STR$(RIGHT.MARGIN) + _
  1847.           " TO (8...72)"
  1848.      GOSUB 12995
  1849.      IF LEN(B$(1)) > 2 THEN _
  1850.         GOTO 3140
  1851. 3130 X = VAL(B$(1))
  1852.      IF X > 7 AND X < 73 THEN _
  1853.         RIGHT.MARGIN = X : _
  1854.         A$ = "Margin now" + _
  1855.              STR$(RIGHT.MARGIN) : _
  1856.         GOTO 3150
  1857. 3140 A$ = "Invalid - Margin UNCHANGED"
  1858. 3150 GOSUB 12979
  1859.      IF UTILITY.MARGIN.CHANGE THEN _
  1860.         RETURN
  1861.      GOTO 2300
  1862. 3200 A$ = "[" + _
  1863.           STRING$(RIGHT.MARGIN - 2,45) + _
  1864.           "]"
  1865.      IF REMOTE.ECHO OR LOCAL.USER THEN _
  1866.         A$ = "    " + _
  1867.              A$
  1868.      GOSUB 12975
  1869.      RETURN
  1870. 3300 A$ = "Line #"
  1871.      IF MARK1 <> 0 THEN _                    'BK012801
  1872.         A$ = "Line # (ENTER for line #" + STR$(MARK1) + ")"    'BK012801
  1873.      GOSUB 12995
  1874.      IF LEN(B$(1)) > 3 THEN _
  1875.         GOTO 3300
  1876.      L = VAL(B$(1))
  1877. 3320 IF L >= 1 AND L <= LINES.IN.MESSAGE THEN _
  1878.         RETURN
  1879. 3330 IF Q = 0 AND MARK1 = 0 THEN _                'BK012801
  1880.         RETURN 2300
  1881.      IF Q = 0 AND MARK1 <> 0 THEN _                'BK012801
  1882.         MARK2 = MARK1 : _                    'BK012801
  1883.         RETURN                            'BK012801
  1884. 3340 A$ = "No such line"
  1885.      GOSUB 12979
  1886.      RETURN 2300
  1887. '
  1888. ' ****  SAVE MESSAGE   ****
  1889. '
  1890. 3400 IF RE.EDIT = TRUE THEN _                    'BK012201
  1891.     KILL.MESSAGE = TRUE : _                    'BK012201
  1892.     CALL PUTMATTR : _                    'BK012201
  1893.     MESSAGE.TO.KILL = CURRENT.MESSAGE : _            'BK012201
  1894.     TEMP = 1 : _                        'BK012201
  1895.     GOSUB 3950 : _                        'BK012201
  1896.     CALL GETMATTR : _                    'BK012201
  1897.     KILL.MESSAGE = FALSE
  1898.      IF GET.EXT.DESC THEN _
  1899.         SYSOP.COMMENT = FALSE : _
  1900.         RETURN
  1901.      IF SYSOP.COMMENT THEN _
  1902.         SYSOP.COMMENT = FALSE : _
  1903.         GOTO 1850
  1904. 3405 GOSUB 4910
  1905.      MESSAGE.RECORD.SAVE$ = MESSAGE.RECORD$
  1906.      A$ = "Adding new msg #" + _
  1907.           STR$(HIGH.MESSAGE.NUMBER + 1)
  1908.      IF NOT LOCAL.USER THEN _
  1909.         CALL UPDTCALR (A$,1)
  1910.      GOSUB 12978
  1911.      SL = 0
  1912.      N$ = ""
  1913.      IF LOW.MESSAGE.NUMBER = 0 THEN _
  1914.         LOW.MESSAGE.NUMBER = 1 : _
  1915.         HIGH.MESSAGE.NUMBER = 1 : _
  1916.         GOTO 3410
  1917.      HIGH.MESSAGE.NUMBER = HIGH.MESSAGE.NUMBER + 1
  1918. 3410 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1919.      MESSAGE.NUMBER$ = STR$(HIGH.MESSAGE.NUMBER) + _
  1920.                        SPACE$(5 - LEN(STR$(HIGH.MESSAGE.NUMBER)))
  1921.      IF MESSAGE.PASSWORD$ = "^READ^" THEN _
  1922.         MID$(MESSAGE.NUMBER$,1,1) = "*" : _
  1923.         SSS = PRIVATE.READ.SEC _
  1924.      ELSE SSS = PUBLIC.READ.SEC
  1925. 3460 MESSAGE.FROM$ = LEFT$(ACTIVE.USER.NAME$ + SPACE$(31),31)        ' KG102401
  1926.      IF RE.EDIT = TRUE THEN _                    'BK012201
  1927.     MESSAGE.FROM$ = LEFT$(MESSAGE.FROM.OLD$ + SPACE$(31),31)'BK012201
  1928.      RE.EDIT = FALSE                        'BK012201
  1929.      MESSAGE.TO$ = LEFT$(MESSAGE.TO$ + SPACE$(31),31)                ' KG102401
  1930.      MID$(MESSAGE.TO$,23,8) = TIME$
  1931.      SUBJECT$ = LEFT$(SUBJECT$ + SPACE$(25),25)                      ' KG102401
  1932.      MESSAGE.PASSWORD$ = LEFT$(MESSAGE.PASSWORD$ + SPACE$(15),15)    ' KG102401
  1933.      IF QUOTED.REPLY = TRUE AND _                         'BK010702
  1934.         LINES.IN.MESSAGE > MAX.MESSAGE.LINES THEN _             'BK010702
  1935.         LINES.IN.MESSAGE = MAX.MESSAGE.LINES                 'BK010702
  1936.      FOR J = 1 TO LINES.IN.MESSAGE
  1937.         SAV$(J) = A$(J)                  'Carbon Copy Mod
  1938.         A$(J) = A$(J) + _
  1939.                 CHR$(227)
  1940.         SL = SL + LEN(A$(J))
  1941.      NEXT
  1942.      IF SL MOD 128 = 0 THEN _
  1943.         N$ = STR$(SL \ 128 + 1) _
  1944.      ELSE N$ = STR$(SL \ 128 + 2)
  1945. 3530 GET 1,NEXT.MESSAGE.RECORD
  1946.      M(ACTIVE.MESSAGES,1) = NEXT.MESSAGE.RECORD
  1947.      M(ACTIVE.MESSAGES,2) = HIGH.MESSAGE.NUMBER
  1948.      LSET MESSAGE.RECORD$ = MESSAGE.NUMBER$ + _
  1949.                             MESSAGE.FROM$ + _
  1950.                             MESSAGE.TO$ + _
  1951.                             CURRENT.DATE$ + _
  1952.                             SUBJECT$ + _
  1953.                             MESSAGE.PASSWORD$ + _
  1954.                             ACTIVE.MESSAGE$ + _
  1955.                             N$ + _
  1956.                             SPACE$(4 - LEN(N$)) + _
  1957.                             MKI$(SSS)
  1958.      PUT 1,NEXT.MESSAGE.RECORD
  1959.      NEXT.MESSAGE.RECORD = NEXT.MESSAGE.RECORD + VAL(N$)
  1960.      N$ = ""
  1961.      NUM.DOTS = 0
  1962.      FOR J = 1 TO LINES.IN.MESSAGE
  1963.         CALL MARKTIME (NUM.DOTS)
  1964.         N$ = N$ + _
  1965.              A$(J)
  1966.         IF LEN(N$) > 127 THEN _
  1967.            LSET MESSAGE.RECORD$ = N$ : _
  1968.            PUT 1 : _
  1969.            N$ = MID$(N$,129)
  1970. 3630 NEXT
  1971.      IF LEN(N$) > 0 THEN _
  1972.         LSET MESSAGE.RECORD$ = N$ : _
  1973.         PUT 1
  1974.      REDIM A$(ADIM)      'Pe 01/29/89 (remove comment 03/26/89)
  1975. 3640 CALL SKIPLINE (1)
  1976.      LSET MESSAGE.RECORD$ = MESSAGE.RECORD.SAVE$
  1977.      GOSUB 24000
  1978. '***   Main Carbon Copy Ability          < Add this Through Next '*** Line
  1979. 3645 IF CARBON$ = "P" THEN _                                     'PE CARBON MOD
  1980.      A$ = CRLF$ + "Send a Carbon Copy to Another User Y/[N]" :_
  1981.      CALL TGET : _
  1982.      IF NOT YES THEN_
  1983.      CARBON$ = "" : _
  1984.       GOTO 3647_
  1985.     ELSE _
  1986.      MESSAGE.TO$ = "" :_
  1987.      CALL MSGTO (HIGHEST.USER.RECORD,MESSAGE.TO$,RECEIVER.RECORD.NUM,FOUND) : _
  1988.      CALL TRIM (MESSAGE.TO$):  _
  1989.      CALL MSGPROT (MESSAGE.TO$,FOUND,MESSAGE.PASSWORD$): _
  1990.      NEXT.MESSAGE.RECORD = NEXT.RECORD.NUMBER + LINES.IN.MESSAGE + 1 : _
  1991.      FOR J = 1 TO LINES.IN.MESSAGE: _
  1992.      A$(J) = SAV$(J):_
  1993.      NEXT J:_
  1994.      GOTO 3400
  1995. '***   End Carbon Copy
  1996. 3647     GOSUB 12985
  1997. ' ---[ notify receiver that has new mail waiting ]---
  1998.      IF RECEIVER.RECORD.NUM > 0 THEN _
  1999.         SUIX = USER.FILE.INDEX : _
  2000.         USER.RECORD.HOLD$ = USER.RECORD$ : _
  2001.         USER.FILE.INDEX = RECEIVER.RECORD.NUM : _
  2002.         GOSUB 12989 : _
  2003.         GET 5, RECEIVER.RECORD.NUM : _
  2004.         X = CVI(MID$(USER.RECORD$,57,2)) : _
  2005.         MID$(USER.RECORD$,57,2) = MKI$(X OR 512) : _
  2006.         PUT 5, RECEIVER.RECORD.NUM : _
  2007.         GOSUB 12991 : _
  2008.         USER.FILE.INDEX = SUIX : _
  2009.         LSET USER.RECORD$ = USER.RECORD.HOLD$ : _
  2010.         CALL QTPUT (FG.3$+"Receiver"+FG.1$+" will be notified of "+CX$(1)+"new"+EMPHASIZE.OFF$+" mail",1) : _
  2011.         RECEIVER.RECORD.NUM = 0
  2012.  
  2013. '************************ MESSAGE THREAD *****************
  2014. 3650 IF REPLY AND Z.ABORT = 0 THEN _         
  2015.         CALL THREAD1(HIGH.MESSAGE.NUMBER,CURRENT.MESSAGE,GRN$)  'GRB
  2016.       Z.ABORT = 0
  2017. '*********************************************************
  2018.  IF REPLY THEN _
  2019.         REPLY = FALSE : _
  2020.         GOTO 5344
  2021.      IF GET.EXT.DESC THEN _
  2022.         LINES.IN.MESSAGE = 0 : _
  2023.         RETURN
  2024. IF LOGOFF$ = "G" THEN 10562 ' Pe 02/04/89
  2025.      RETURN 1200
  2026. '
  2027. ' ****  K - COMMAND FROM MAIN MENU (KILL MESSAGE)  ****
  2028. '
  2029. 3900 KILL.MESSAGE = FALSE
  2030.      CALL SKIPLINE (1)
  2031.      IF Q <> 1 THEN _
  2032.         TEMP = 2 : _
  2033.         GOTO 3935
  2034. 3930 A$ = "Msg #(s) to Kill" + PRESS.ENTER.EXPERT$
  2035.      GOSUB 12995
  2036.      IF Q = 0 THEN _
  2037.         RETURN
  2038.      GOSUB 1893
  2039.      TEMP = 1
  2040. 3935 CALL CHECKINT (B$(TEMP))
  2041.      IF EC <> 0 THEN _
  2042.         GOTO 3930
  2043.      MESSAGE.TO.KILL = TESTED.INTEGER.VALUE
  2044. 3950 GOSUB 5344
  2045.      CALL KILLMSG (MESSAGE.TO.KILL,ACTIVE.MESSAGES,GRN$)      'Pe 01/12/89
  2046. 4040 IF TEMP < Q THEN _
  2047.         TEMP = TEMP + 1 : _
  2048.         GOTO 3935
  2049.      IF KILL.MESSAGE THEN _
  2050.         RETURN
  2051.      GOTO 3930
  2052. '
  2053. ' ****  Sysop Available toggle
  2054. '
  2055. 4130  SUBROUTINE.PARAMETER = -8
  2056.       CALL FINDFUNC
  2057.       SUBROUTINE.PARAMETER = 0
  2058.       RETURN
  2059. '
  2060. ' ****  X)pert Toggle
  2061. '
  2062. 4240 CALL TOGGLE(9)
  2063.      RETURN
  2064. '  ****************************************************************************
  2065. '  *  Ask users who have NOT Read all new messages do they want to NOW!       *
  2066. '  *  Carrage Return Defaults to [Y]es                                        *
  2067. '  ****************************************************************************
  2068. 4275 A$ = "Read all New Messages Now ([Y]/N) ":_  
  2069.      GOSUB 12995                            'JABASKMAIL
  2070. 4279 IF NOT NO THEN _                            'JABASKMAIL
  2071.     Q = 2 :_
  2072.      B$(2) = "*" :_           'PE 11/29/88
  2073.      GOTO 4330 :_                            'JABASKMAIL
  2074.      ELSE RETURN                            'JABASKMAIL
  2075. '
  2076. ' ****  T)opic - QUICK SCAN MESSAGES  ****
  2077. '
  2078. 4320 QUICK.SCAN.MESSAGES = TRUE
  2079.      READ.MESSAGES = FALSE
  2080.      SCAN.MESSAGES = FALSE
  2081.      MSG.START = 76
  2082.      MSG.END = 100
  2083.      SEC.INDEX= 0
  2084.      GOTO 4350
  2085. '
  2086. ' ****  R - COMMAND FROM MAIN MENU (READ MESSAGES)  *****
  2087. '
  2088. 4330 QUICK.SCAN.MESSAGES = FALSE
  2089.      READ.MESSAGES = TRUE
  2090.      HIGHLITE.REC = -1
  2091.      SCAN.MESSAGES = FALSE
  2092.      MSG.START = 6
  2093.      MSG.END = 100
  2094.      IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  2095.         IF READ.MSG.IN$ <> ACTIVE.MESSAGE.FILE$ THEN _
  2096.            READ.MSG.IN$ = ACTIVE.MESSAGE.FILE$ : _
  2097.            CALL UPDTCALR ("Read Messages in " + READ.MSG.IN$,1)
  2098.      GOSUB 1300
  2099.      GOTO 4350
  2100. '
  2101. ' ****  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)  ****
  2102. '
  2103. 4340 IF Q < 2 THEN _
  2104.         GOSUB 1300
  2105. 4345 QUICK.SCAN.MESSAGES = FALSE
  2106.      READ.MESSAGES = FALSE
  2107.      SCAN.MESSAGES = TRUE
  2108.      MSG.START = 6
  2109.      MSG.END = 100
  2110.      SEC.INDEX = 0
  2111. '
  2112. ' ** MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN) ALL USE THIS ROUTINE **
  2113. '
  2114. 4350 SEARCH.HEADER$ = ""
  2115.      SELECT.BY.NUMBER = FALSE
  2116. 4352 SEARCH.STRING$ = ""
  2117.      QUOTED.REPLY = FALSE                    'BK010501
  2118.      RE.EDIT = FALSE                        'BK012201
  2119.      DONT.PRINT = FALSE                        'BK012405
  2120.      JUST.REPLIED = FALSE                    'BK012601
  2121.      GOSUB 1893
  2122.      GOSUB 5344
  2123.      Z$ = ""
  2124.      FOR I = 2 TO Q
  2125.         IF INSTR("Ss*",B$(I)) > 0 THEN _
  2126.            B$(I) = MID$(STR$(LAST.MESSAGE.READ+1),2) + "+"
  2127.         IF INSTR("Ll",B$(I)) > 0 THEN _                              ' KG112601
  2128.            B$(I) = MID$(STR$(HIGH.MESSAGE.NUMBER),2) + "-"    'PE 12/10/88
  2129.         IF LEN(B$(I)) = 1 THEN _                                     ' KG102704
  2130.            IF INSTR("Cc",B$(I)) > 0 THEN _                           ' KG102704
  2131.               NON.STOP = TRUE                                        ' KG102704
  2132.      NEXT
  2133. 4360 LG$(11) = Z$
  2134.      MESSAGES.SELECTED.INDEX = 1
  2135.      NUMBER.MESSAGES.SELECTED = Q
  2136.      ADDRESSED.TO.USER = FALSE
  2137.      TO.REQUESTED = FALSE
  2138.      FROM.REQUESTED = FALSE
  2139.      IF PAGE.LENGTH < 1 THEN _
  2140.         NON.STOP = TRUE
  2141. 4370 MESSAGES.SELECTED.INDEX = MESSAGES.SELECTED.INDEX  + 1
  2142. 4371 IF MESSAGES.SELECTED.INDEX <= NUMBER.MESSAGES.SELECTED THEN _
  2143.         CALL CHECKINT (B$(MESSAGES.SELECTED.INDEX)) : _
  2144.         IF EC <> 0 THEN _
  2145.            EL = 4371 : _
  2146.            GOTO 13000 _
  2147.         ELSE CURRENT.MESSAGE = TESTED.INTEGER.VALUE : _
  2148.              GOTO 4415
  2149. 4380 NON.STOP = FALSE
  2150.        A1$ = ""                                                 'Tkey *
  2151.        A1$ = crlf$ + _
  2152.        "Message Sub commands : "+ crlf$ + _
  2153.        "A)ll" + crlf$ + _
  2154.        "N)umber" + crlf$ + _                     'Tkey *
  2155.        "S)ince last call" + crlf$
  2156. A1$ = A1$ + "T)ext" + crlf$ + _
  2157.        "L)ast" + crlf$ + _
  2158.        "M)ine only" + crlf$ +"H)elp or"
  2159. IF EXPERT.USER THEN _
  2160. A1$ =  "A)ll, N)umber, S)ince," : _               'PE 12/10/88
  2161. A1$ = A1$+ " T)ext, M)ine, L)ast, H)elp or"
  2162.      TURBO.KEY = -TURBO.KEY.USER
  2163.      IF ADDRESSED.TO.USER OR TO.REQUESTED OR FROM.REQUESTED THEN _
  2164.           CALL QTPUT(CX$(3) + "Selecting" + CX$(4) + _           'Tkey *
  2165.                      " Your" + CX$(3) + " messages....",1) : _   'Tkey *
  2166.           SELECT.BY.NUMBER = TRUE                                'Tkey *
  2167.        IF SEARCH.STRING$ <> "" THEN _
  2168.           CALL QTPUT(CX$(3) + "Selecting messages with '" + _    'Tkey *
  2169.                      CX$(4) + SEARCH.STRING$ + CX$(7) + _        'Tkey *
  2170.                     "'....",1) : _                               'Tkey *
  2171.     SELECT.BY.NUMBER = TRUE 
  2172.        IF SELECT.BY.NUMBER THEN _                                'Tkey *
  2173.           A1$ = "Enter message number(s)"  + _  'Tkey *
  2174.                 STR$(LOW.MESSAGE.NUMBER)  + _            'Tkey *
  2175.                 " to" + STR$(M(ACTIVE.MESSAGES,2)) + _  'Tkey *
  2176.            " A)ll " : _ 
  2177.       TURBO.KEY = FALSE
  2178. 4390 A$ = A1$ + PRESS.ENTER.EXPERT$
  2179. 4400 GOSUB 12995
  2180.      IF Q = 0 THEN _
  2181.        GOSUB 4650 : _
  2182.         RETURN
  2183.      IF SELECT.BY.NUMBER THEN _                                   'Tkey *
  2184.         IF INSTR("Aa",LEFT$(B$(1),1)) THEN _                      'Tkey *
  2185.            B$(1) = "1+"                                           'Tkey *
  2186.      IF LEN(B$(1)) = 1 THEN                                       'Tkey *
  2187.         IF INSTR("Aa",LEFT$(B$(1),1)) THEN _                      'Tkey *
  2188.            B$(1) = "1+"                                           'Tkey *
  2189.      IF LEN(B$(1)) = 1 THEN _                                'Pe 12/10/88
  2190.          IF INSTR("Ll",LEFT$(B$(1),1)) THEN _                'Pe 12/10/88
  2191.            B$(1) = "9999-"                                   'Pe 12/10/88
  2192.       IF LEN(B$(1)) = 1 THEN _
  2193.         IF INSTR("Qq",LEFT$(B$(1),1)) THEN _
  2194.          GOSUB 4650 : _
  2195.            RETURN 
  2196.        IF INSTR("Hh",LEFT$(B$(1),1)) THEN _ 
  2197.                 FILE.NAME$ = HELP.PATH$ + "MR" + HELP.EXTENSION$ : _
  2198.                 GOSUB 1790 : _
  2199.         TURBO.KEY = -TURBO.KEY.USER : _
  2200.                 GOTO 4390
  2201.         IF INSTR("Nn",LEFT$(B$(1),1)) THEN _                       'Tkey *
  2202.            SELECT.BY.NUMBER = TRUE : _                             'Tkey *
  2203.            GOTO 4380                                               'Tkey *
  2204.         IF INSTR("Tt",LEFT$(B$(1),1)) THEN _                       'Tkey *
  2205.            A1$ =  "Enter text to search for " : _          'Tkey *
  2206.            GOTO 4390                                               'Tkey *
  2207.      END IF                                                        'Tkey *
  2208.      MESSAGES.SELECTED.INDEX = 0
  2209.      NUMBER.MESSAGES.SELECTED = Q
  2210.      GOTO 4370
  2211. 4415 FORWARD = FALSE
  2212.      REVERSE = FALSE
  2213.      IF LEN(B$(MESSAGES.SELECTED.INDEX)) = 1 THEN _
  2214.         IF INSTR("Ss*",B$(MESSAGES.SELECTED.INDEX)) > 0 THEN _
  2215.            CURRENT.MESSAGE = LAST.MESSAGE.READ + 1 : _
  2216.            FORWARD = TRUE : _
  2217.            GOTO 4430
  2218.    IF LEN(B$(MESSAGES.SELECTED.INDEX)) = 1 THEN _    'Pe 12/10/88
  2219.      IF INSTR("Ll",B$(MESSAGES.SELECTED.INDEX)) > 0 THEN _   ' KG112601
  2220.                   CURRENT.MESSAGE = HIGH.MESSAGE.NUMBER : _  ' KG112601
  2221.                 REVERSE = TRUE : _                                   ' KG112601
  2222.                 GOTO 4430                                            ' KG112601
  2223. 4416 IF INSTR("Mm",B$(MESSAGES.SELECTED.INDEX)) THEN _
  2224.         ADDRESSED.TO.USER = TRUE : _
  2225.         GOTO 4370
  2226.      A = INSTR("FfTt",B$(MESSAGES.SELECTED.INDEX))
  2227.      IF A > 0 THEN _
  2228.         TO.REQUESTED = (A > 2) : _
  2229.         FROM.REQUESTED = (A < 3) : _
  2230.         GOTO 4370
  2231.      IF CURRENT.MESSAGE = 0 THEN _
  2232.         IF SEARCH.HEADER$ <> "" THEN _
  2233.            GOTO 4370 _
  2234.         ELSE SEARCH.STRING$ = B$(MESSAGES.SELECTED.INDEX) : _
  2235.              CALL ALLCAPS (SEARCH.STRING$) : _
  2236.              CALL REMOVE (SEARCH.STRING$,CHR$(34) + CHR$(39)) : _
  2237.              SEARCH.HEADER$ = SEARCH.STRING$ : _
  2238.              GOTO 4370
  2239.      CALL SKIPLINE (1)
  2240. 4430 IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "+" THEN _
  2241.         FORWARD = TRUE
  2242.      IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "-" THEN _
  2243.         REVERSE = TRUE : _
  2244.         GOTO 4490
  2245. 4450 MESSAGE.DIM.INDEX = 1
  2246. 4452 IF MESSAGE.DIM.INDEX > ACTIVE.MESSAGES THEN _
  2247.       GOSUB 4650 : _
  2248.         GOTO 4515
  2249.      IF READ.MESSAGES AND _
  2250.         M(MESSAGE.DIM.INDEX,2) = CURRENT.MESSAGE THEN _
  2251.         GOTO 4520
  2252. 4470 IF ((READ.MESSAGES AND FORWARD) OR _
  2253.         QUICK.SCAN.MESSAGES OR SCAN.MESSAGES) AND _
  2254.         M(MESSAGE.DIM.INDEX,2) >= CURRENT.MESSAGE THEN _
  2255.         GOTO 4520
  2256. 4480 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + 1
  2257.      GOTO 4452
  2258. 4490 MESSAGE.DIM.INDEX = ACTIVE.MESSAGES
  2259. 4492 IF MESSAGE.DIM.INDEX < 1 THEN _
  2260.       GOSUB 4650 : _
  2261.         GOTO 4515
  2262.      IF M(MESSAGE.DIM.INDEX,2) <= CURRENT.MESSAGE THEN _
  2263.         GOTO 4540
  2264. 4510 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX - 1
  2265.      GOTO 4492
  2266. 4515 A$ = "No such msg #" + _
  2267.           STR$(CURRENT.MESSAGE)
  2268.      GOSUB 12979
  2269.      GOTO 4370
  2270. 4520 ENDING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2271.      IF READ.MESSAGES AND NOT FORWARD THEN _
  2272.         GOTO 4560
  2273. 4530 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2274.      ENDING.MESSAGE.INDEX = ACTIVE.MESSAGES
  2275.      SO = 1
  2276.      GOTO 4550
  2277. 4540 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2278.      ENDING.MESSAGE.INDEX = 1
  2279.      SO = -1
  2280. 4550 XXX = ENDING.MESSAGE.INDEX + SO
  2281.      MESSAGE.DIM.INDEX = STARTING.MESSAGE.INDEX
  2282. 4552 IF MESSAGE.DIM.INDEX = XXX THEN _
  2283.         GOTO 4637
  2284. 4560   CURRENT.HEADER = M(MESSAGE.DIM.INDEX,1)
  2285.        IF CURRENT.HEADER < 1 THEN _
  2286.           GOTO 4515
  2287.        GET 1,CURRENT.HEADER
  2288.        PASSWORD.FAILED = 0
  2289.        UH = 0
  2290.        Z$ = MID$(MESSAGE.RECORD$,101,15)
  2291.        X = 1
  2292. 4561   X$ = MID$(MESSAGE.RECORD$,X)
  2293.        FF = INSTR(X$,MESSAGE.USER.NAME$)
  2294. '===>       IF FF > 0 THEN _
  2295. '          X = LEN(MESSAGE.USER.NAME$)  <====== orig code
  2296.        DGSFF = FALSE                                              'DGS-ALS
  2297.        IF FF = 0 THEN _                                           'DGS-ALS
  2298.       FF = INSTR(X$,LEFT$(ACTIVE.USER.NAME$,22)) : _          'DGS-ALS
  2299.       DGSFF = TRUE                                            'DGS-ALS
  2300.        IF FF > 0 THEN _
  2301.       IF DGSFF = TRUE THEN _                                  'DGS-ALS
  2302.          X = LEN (ACTIVE.USER.NAME$) _                        'DGS-ALS
  2303.       ELSE _                                                  'DGS-ALS
  2304.          X = LEN(MESSAGE.USER.NAME$) _                        'DGS-ALSMOD
  2305.        ELSE IF SYSOP THEN _
  2306.                FF = INSTR(X$,"SYSOP") : _
  2307.                X = 5 : _
  2308.                IF FF = 0 THEN _
  2309.                   X = LEN(SYSOP.FULL.NAME$) : _
  2310.                   FF = INSTR(X$,SYSOP.FULL.NAME$)
  2311.        IF FF > 0 THEN _
  2312.           X = X + FF : _
  2313.           IF (FF < 7 OR MID$(MESSAGE.RECORD$,FF - 1,1) = " ") AND (X > 58 OR MID$(MESSAGE.RECORD$,X,1) = " ") THEN _
  2314.              UH = TRUE _
  2315.           ELSE IF FF < 37 THEN _
  2316.                   X = 37 : _
  2317.                   GOTO 4561
  2318.        MSG.TO.CALLER = UH AND (FF = 37)                              ' KG101403
  2319.        MSG.FROM.CALLER = UH AND (FF = 6)
  2320. 4562   IF NOT SYSOP THEN _
  2321.           IF INSTR(MESSAGE.RECORD$,"^READ^") > 0 AND NOT UH THEN _
  2322.              PASSWORD.FAILED = TRUE : _
  2323.              IF FORWARD OR REVERSE THEN _
  2324.                 GOTO 4635
  2325. 4563   CURRENT.MESSAGE = VAL(MID$(MESSAGE.RECORD$,2,4))
  2326.        IF TO.REQUESTED THEN _
  2327.           IF NOT MSG.TO.CALLER THEN _
  2328.              GOTO 4625
  2329.        IF FROM.REQUESTED THEN _
  2330.           IF NOT MSG.FROM.CALLER THEN _
  2331.              GOTO 4625
  2332.        IF ADDRESSED.TO.USER AND NOT UH THEN _
  2333.           GOTO 4625
  2334.        X$ = MID$(MESSAGE.RECORD$,121,2)
  2335.        IF X$ = "  " THEN _
  2336.           MESSAGE.SECURITY = MINIMUM.LOGON.SECURITY _
  2337.        ELSE MESSAGE.SECURITY = CVI(X$)
  2338.        IF USER.SECURITY.LEVEL < MESSAGE.SECURITY THEN _
  2339.           GOTO 4625
  2340. 4580   IF INSTR(MESSAGE.RECORD$,LG$(11)) = 0 THEN _
  2341.           GOTO 4635
  2342. 4581   IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ THEN _
  2343.           GOTO 4630
  2344.        JUST.SEARCHING = FALSE
  2345.        IF SEARCH.HEADER$ <> "" THEN _
  2346.           FF = INSTR(MESSAGE.RECORD$,SEARCH.HEADER$) : _
  2347.           IF FF >= MSG.START AND FF <= MSG.END THEN _
  2348.              HIGHLITE.POS = FF : _
  2349.              GOTO 4582 _
  2350.           ELSE IF READ.MESSAGES AND SEARCH.STRING$ <> "" THEN _
  2351.                   JUST.SEARCHING = TRUE : _
  2352.                   GOTO 4582 _
  2353.                ELSE GOTO 4625
  2354. 4582   PG = FALSE
  2355.        IF MID$(Z$,1,1) = "!" THEN _
  2356.           IF NOT SYSOP THEN _
  2357.              PG = TRUE : _
  2358.              PASSWORD.SAVE$ = MID$(Z$,2) + _
  2359.                               " " : _
  2360.              ATTEMPTS.ALLOWED = 0 : _
  2361.              SUBROUTINE.PARAMETER = 1 : _
  2362.              CALL PASSWRD
  2363. 4584   IF PASSWORD.FAILED AND _
  2364.           (QUICK.SCAN.MESSAGES OR (SCAN.MESSAGES AND NOT PG)) THEN _
  2365.           GOTO 4635
  2366. 4585   IF PASSWORD.FAILED THEN _
  2367.           IF PG THEN _
  2368.              SJ$ = "<PASSWORD>" _
  2369.           ELSE SJ$ = "<PROTECTED>" _
  2370.        ELSE SJ$ = MID$(MESSAGE.RECORD$,76,25)
  2371. 4590   IF QUICK.SCAN.MESSAGES THEN _
  2372.           A$ = LEFT$(MESSAGE.RECORD$,5) + _
  2373.                " " + _
  2374.                LEFT$(SJ$,19) + _
  2375.                " " : _
  2376.           CALL CHKCOLOR (A$,SEARCH.HEADER$,EMPHASIZE.OFF$) : _
  2377.           GOSUB 12978 : _
  2378.           SEC.INDEX = SEC.INDEX + 1 : _
  2379.           IF SEC.INDEX = 3 THEN _
  2380.              SEC.INDEX = 0 : _
  2381.              CALL SKIPLINE (1) : _
  2382.              GOTO 4630  _
  2383.           ELSE GOTO 4630
  2384. 4600   IF SCAN.MESSAGES THEN _
  2385.           GOSUB 8020 : _
  2386.           GOTO 4630
  2387.        IF NOT JUST.SEARCHING THEN _
  2388.           GOSUB 8000                                    'Pe 03/20/89
  2389.   IF QUOTED.REPLY = TRUE THEN _                'BK012405
  2390.       GOTO 4610                        'BK012405
  2391.        IF RET THEN _
  2392.           GOTO 4630
  2393.        IF M(MESSAGE.DIM.INDEX,2) > LAST.MESSAGE.READ THEN _
  2394.           MAIL.WAITING = FALSE : _
  2395.           LAST.MESSAGE.READ = M(MESSAGE.DIM.INDEX,2)
  2396.        CAN.CHG.SEC = (USER.SECURITY.LEVEL => SEC.CHANGE.MSG)
  2397.        IF EXPERT.USER THEN _
  2398.           A1$ = ",R,T,=,+,-" + _
  2399.                 MID$(",K",1,- (UH OR SYSOP) * 2) + _
  2400.                 MID$(",S",1, - CAN.CHG.SEC * 2) + _        'BK012201
  2401.                 MID$(",E",1, - (SYSOP OR MSG.FROM.CALLER) * 2) _'BK012302
  2402.        ELSE A1$ = ",R)ply,T)hrd,=)reread,+,-" + _        'BK012201
  2403.                   MID$(",K)ill",1, - (UH OR SYSOP) * 7) + _
  2404.                   MID$(",S)ec",1, - CAN.CHG.SEC * 12) + _    'BK012201
  2405.                   MID$(",E)dit",1, - (SYSOP OR MSG.FROM.CALLER) * 7)'BK012302
  2406.        TURBO.KEY = -TURBO.KEY.USER
  2407.        IF JUST.SEARCHING OR NOT JUST.REPLIED THEN _
  2408.           GOTO 4610
  2409.        JUST.REPLIED = FALSE
  2410.        TURBO.KEY = -TURBO.KEY.USER
  2411.        CALL ASKMORE (A1$,TRUE,FALSE,MESSAGES.SELECTED.INDEX,FALSE)
  2412.        CALL SKIPLINE (1)
  2413.        IF NO THEN _
  2414.           RETURN
  2415.        CALL ALLCAPS (B$)
  2416.        REPLY = (REPLY OR B$ = "R")
  2417.        IF B$ <> "=" THEN _
  2418.           GOTO 4618
  2419.        CALL SKIPLINE (1)
  2420. 4610   IF NOT PASSWORD.FAILED THEN _
  2421.           GOTO 4613
  2422.        IF PG THEN _
  2423.           ATTEMPTS.ALLOWED = 2 : _
  2424.           SUBROUTINE.PARAMETER = 2 : _
  2425.           CALL PASSWRD
  2426. 4611   IF PASSWORD.FAILED THEN _
  2427.           GOTO 4625
  2428. 4613  CALL THREAD3(CURRENT.MESSAGE,GRN$)
  2429.        GOSUB 9000
  2430.        DONT.PRINT = FALSE               'BK012405
  2431.        IF JUST.SEARCHING THEN _
  2432.           GOTO 4625
  2433.        IF MESSAGES.SELECTED.INDEX > NUMBER.MESSAGES.SELECTED THEN _
  2434.           GOTO 4650
  2435.        CALL SKIPLINE (1)
  2436. 4614   GOSUB 41000
  2437.        KILL.MESSAGE = FALSE
  2438.        REPLY = FALSE
  2439.        IF NON.STOP THEN _
  2440.           GOTO 4625
  2441. 4616   TURBO.KEY = -TURBO.KEY.USER
  2442.        CALL ASKMORE (A1$,TRUE,FALSE,XX,FALSE)
  2443.        IF NO THEN _
  2444.           RETURN
  2445.        CALL ALLCAPS(B$(1))
  2446.        REPLY = (REPLY OR B$(1) ="R")
  2447.        IF B$(1) = "=" THEN _
  2448.           CALL SKIPLINE (1) : _
  2449.           GOTO 4560
  2450. '
  2451. ' ****  CHECK FOR CHANGE SECURITY  ****
  2452. '
  2453. 4618  IF B$(1) = "S" AND CAN.CHG.SEC THEN _
  2454.          GOSUB 4665
  2455.       IF B$(1) = "T" THEN _
  2456.          CALL SETTHREAD (CURRENT.MESSAGE, SUBJECT$) : _
  2457.          IF Q > 0 THEN _
  2458.             SEARCH.HEADER$ = B$(2) : _
  2459.             CALL REMOVE (SEARCH.HEADER$,CHR$(34)+CHR$(39)) : _
  2460.             GOTO 4352
  2461.       A = INSTR(" +-",B$(1))
  2462.       IF A > 1 THEN _
  2463.          CURRENT.MESSAGE = CURRENT.MESSAGE + 5 - 2 * A : _
  2464.          FORWARD = (A = 2) : _                                       ' KG122502
  2465.          REVERSE = (NOT FORWARD) : _                                 ' KG122502
  2466.          SEARCH.STRING$ = "" : _                                     ' KG122502
  2467.          IF REVERSE THEN _                                           ' KG122502
  2468.             GOTO 4490 _                                              ' KG122502
  2469.          ELSE GOTO 4450                                              ' KG122502
  2470. '
  2471. ' ****  KILL CURRENT MESSAGE  ****
  2472. '
  2473.       IF KILL.MESSAGE AND (UH OR SYSOP) THEN _
  2474.          IF USER.SECURITY.LEVEL >= OPT.SEC(9) THEN _
  2475.             CALL PUTMATTR : _
  2476.             MESSAGE.TO.KILL = CURRENT.MESSAGE : _
  2477.             TEMP = Q : _
  2478.             GOSUB 3950 : _
  2479.             CALL GETMATTR : _
  2480.             GOTO 4625 _
  2481.          ELSE VIOLATION$ = "MORE KILL" : _
  2482.               GOSUB 1380 : _
  2483.               GOTO 4625
  2484. 4619   IF (SYSOP OR MSG.FROM.CALLER) AND _            'BK012302
  2485.          (B$(1) = "E") THEN _                    'BK012201
  2486.          GOSUB 4670                        'BK012201
  2487. '
  2488. ' ****  REPLY TO CURRENT MESSAGE  ****
  2489. '
  2490. 4620   IF NOT REPLY THEN _
  2491.           GOTO 4625
  2492. 4621   IF USER.SECURITY.LEVEL < OPT.SEC(5) THEN _
  2493.           VIOLATION$ = "MORE RE" : _
  2494.           GOSUB 1380 : _
  2495.           REPLY = FALSE : _
  2496.           GOTO 4625
  2497.        IF LEFT$(SUBJECT$,3) <> "(R)" THEN _
  2498.           SUBJECT$ = "(R)" + _
  2499.                      LEFT$(ORIG.SUBJECT$,22)            'KG110501
  2500. 4622   MESSAGE.TO$ = MESSAGE.FROM$
  2501.        CALL TRIM (MESSAGE.TO$)
  2502.        MESSAGE.FROM$ = ACTIVE.USER.NAME$
  2503.        CALL PUTMATTR
  2504.        DONT.PRINT = FALSE                    'BK012701
  2505.        IF LOW.MESSAGE.NUMBER > 0 AND _                'BK012402
  2506.           ACTIVE.MESSAGES = MAXIMUM.MESSAGES THEN _        'BK012402
  2507.              A$ = "No room for new messages!  Try tomorrow" : _    'BK012402
  2508.                 GOSUB 12976 : _                    'BK012402
  2509.         CALL SKIPLINE (2) : _                'BK012402
  2510.                 GOTO 4624                    'BK012402
  2511.        A$ = "Quote " + MESSAGE.TO$ + "'s message (Y/[N])"    'BK010501
  2512.        GOSUB 12999                        'BK010501
  2513.        IF NOT YES THEN _                    'BK012403
  2514.           GOTO 4623                        'BK010501
  2515.        QUOTED.REPLY = TRUE                    'BK010501
  2516.        LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1            'BK010501
  2517.        IF LINES.IN.MESSAGE > ADIM THEN _            'BK010702
  2518.           LINES.IN.MESSAGE = ADIM                'BK010702
  2519.        FOR X = 1 TO LINES.IN.MESSAGE                'BK010501
  2520.           A$(X) = "> " + A$(X)                    'BK010702
  2521.        NEXT                            'BK010501
  2522.        CALL SKIPLINE (1)                    'BK010501
  2523.        IF LINES.IN.MESSAGE = ADIM THEN _            'BK010702
  2524.           CALL QTPUT ("Quote has been truncated to " + _    'BK010702
  2525.                       STR$(ADIM) + " lines for editing!",1)    'BK010702
  2526.        IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES THEN _        'BK010702
  2527.           CALL QTPUT ("Message cannot exceed " + _        'BK010702
  2528.                       STR$(MAX.MESSAGE.LINES) + " lines!" + _    'BK010702
  2529.                       " Please delete lines to fit!",1) : _    'BK010702
  2530.           CALL SKIPLINE (1)                    'BK010702
  2531.        GOSUB 2000                        'BK010501
  2532. A$ = CRLF$ +"Use the C)ont Command to Continue with Message"+ CRLF$'Pe 01/27/89
  2533. A$ = A$+"or the D)elete Command to delete un-wanted lines...."     'Pe 01/27/89
  2534.  CALL QTPUT (A$,1)                                                 'Pe 01/27/88
  2535.        GOSUB 2299                        'BK010501
  2536.        GOTO 4624                        'BK010501
  2537. 4623 QUOTED.REPLY = FALSE
  2538.        GOSUB 2000                        'BK010501
  2539. 4624   REPLY = FALSE                        'BK010501
  2540.        JUST.REPLIED = TRUE
  2541.        CALL GETMATTR
  2542.        DONT.PRINT = TRUE                    'BK012405
  2543.        B$ = "="                            'BK012405
  2544.        IF QUOTED.REPLY = FALSE THEN _                'BK012701
  2545.           QUOTED.REPLY = TRUE                    'BK012701
  2546.        GOTO 4560                        'BK012405
  2547. 4625   QUOTED.REPLY = FALSE                    'BK012701
  2548.        JUST.REPLIED = FALSE                    'BK012601
  2549.    IF NOT FORWARD AND NOT REVERSE THEN _
  2550.           GOTO 4370
  2551. 4630   CALL ASKMORE (",#(s) to read ",TRUE,TRUE,XX,FALSE)
  2552.        IF Q = 0 THEN _
  2553.           GOTO 4631
  2554.        IF NO THEN _
  2555.           RETURN
  2556.        IF SUBROUTINE.PARAMETER = -1 THEN _
  2557.           RETURN 10595
  2558.        IF RET THEN _
  2559.           RETURN
  2560.        Z$ = B$(1)
  2561.        CALL ALLCAPS (Z$)
  2562.        IF VAL(Z$) > 0 THEN _
  2563.           FOR I = Q TO 1 STEP -1 : _
  2564.              B$(I + 1) = B$(I) : _
  2565.           NEXT : _
  2566.           B$(1) = "R" : _
  2567.           Q = Q + 1 : _
  2568.           RETURN 1235
  2569. 4631   CALL CARRIER
  2570.        IF SUBROUTINE.PARAMETER THEN _
  2571.           RETURN 10595
  2572.        IF RET THEN _
  2573.           RETURN
  2574. 4635 IF SO = 0 THEN _
  2575.         SO = 1
  2576.      MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + SO
  2577.      GOTO 4552
  2578. 4637 IF READ.MESSAGES THEN _
  2579.         SEARCH.STRING$ = "" : _
  2580.         SEARCH.HEADER$ = "" : _
  2581.         TO.REQUESTED = FALSE : _
  2582.         FROM.REQUESTED = FALSE : _
  2583.         ADDRESSED.TO.USER = FALSE : _
  2584.         GOTO 4370
  2585. 4650 CALL SKIPLINE (1) 'GOSUB 12979
  2586.      CALL QTPUT (CX$(1)+"------- End of selected Messages ---------"+CX$(7),1)
  2587. '     CALL ASKMORE ("",TRUE,FALSE,X,TRUE) 'Pe 05/11/89
  2588. Call Delayit (1)
  2589.      RETURN
  2590. '
  2591. ' ****    - CHANGE MESSAGE READ SECURITY   ****
  2592. '
  2593. 4665 IF Q > 1 THEN _
  2594.         B$ = B$(2) : _
  2595.         GOTO 4666
  2596.      A$ = "Change min sec to read from" + _
  2597.           STR$(MESSAGE.SECURITY) + _
  2598.           " to"
  2599.      GOSUB 12995
  2600.      IF Q=0 THEN _
  2601.         RETURN
  2602. 4666 CALL CHECKINT (B$)
  2603.      IF EC <> 0 THEN _
  2604.         RETURN
  2605.      X = TESTED.INTEGER.VALUE
  2606.      SUBROUTINE.PARAMETER = 3
  2607.      CALL FILELOCK
  2608.      GET 1,CURRENT.HEADER
  2609.      MID$(MESSAGE.RECORD$,121,2) = MKI$(X)
  2610.      PUT 1,CURRENT.HEADER
  2611.      SUBROUTINE.PARAMETER = 4
  2612.      CALL FILELOCK
  2613.      CALL QTPUT ("Security changed to" + STR$(X),1)
  2614.      RETURN
  2615. '                                'BK012201
  2616. ' ****  ! - RE-EDIT CURRENT MESSAGE  ****            'BK012201
  2617. '                                'BK012201
  2618. 4670 IF SYSOP THEN GOTO 4671
  2619.         IF MSG.RECEIVED = TRUE THEN _                'BK012501
  2620.         A$ = "Already received." + _                'BK012404
  2621.              "  Please enter a NEW message!" : _        'BK012404
  2622.         GOSUB 12976 : _                        'BK012404
  2623.         CALL SKIPLINE (1) : _                    'BK012404
  2624.         JUST.REPLIED = TRUE : _                    'BK012404
  2625.         RETURN 4560                        'BK012404
  2626. 4671 RE.EDIT = TRUE : _                        'BK012201
  2627.      MESSAGE.TO.OLD$ = MESSAGE.TO$ : _                'BK012201
  2628.      MESSAGE.FROM.OLD$ = MESSAGE.FROM$ : _            'BK012201
  2629.      SUBJECT.OLD$ = SUBJECT$ : _                'BK012201
  2630.      MESSAGE.PASSWORD.OLD$ = MESSAGE.PASSWORD$ : _        'BK012201
  2631.      CALL TRIM (MESSAGE.TO$) : _                'BK012201
  2632.      CALL PUTMATTR : _                        'BK012601
  2633.      IF LOW.MESSAGE.NUMBER > 0 AND _                'BK012401
  2634.         ACTIVE.MESSAGES = MAXIMUM.MESSAGES THEN _        'BK012401
  2635.            A$ = "No room for new messages!  Try tomorrow" : _    'BK012401
  2636.            GOSUB 12976 : _                    'BK012401
  2637.            CALL SKIPLINE(2) : _                    'BK012401
  2638.            RETURN 4624                        'BK012401
  2639.      A$ = "TO: (Enter for " + _                    'BK012201
  2640.            MESSAGE.TO$ + _                    'BK012201
  2641.           ")" : _                        'BK012201
  2642.      GOSUB 12995 : _                        'BK012201
  2643.      MESSAGE.TO$ = B$ : _                    'BK012201
  2644.      IF MESSAGE.TO$ = "" THEN _                    'BK012301
  2645.         MESSAGE.TO$ = MESSAGE.TO.OLD$                'BK012301
  2646.      CALL ALLCAPS (MESSAGE.TO$) : _                'BK012301
  2647.      CALL TRIM (MESSAGE.TO$) : _                'BK012301
  2648.      GOSUB 2000 : _                        'BK012301
  2649.      IF (MESSAGE.TO$ = "") OR _                    'BK012201
  2650.         (SUBJECT$ = "") OR _                    'BK012201
  2651.         (MESSAGE.PASSWORD$ = "") THEN _                'BK012201
  2652.            MESSAGE.TO$ = MESSAGE.TO.OLD$ : _            'BK012201
  2653.        SUBJECT$ = SUBJECT.OLD$ : _                'BK012201
  2654.        MESSAGE.PASSWORD$ = MESSAGE.PASSWORD.OLD$ : _    'BK012201
  2655.           CALL QTPUT ("Message UNCHANGED!",1) : _        'BK012201
  2656.           B$ = "" : _                    'BK012201
  2657.           RETURN                        'BK012201
  2658.       LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _        'BK012201
  2659.       RETURN 2299                        'BK012201
  2660. '
  2661. '
  2662. ' ****  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)   ****
  2663. '
  2664. 4700 IF NOT SYSOP.AVAILABLE THEN _
  2665.         A$ = "Sorry, " + _                                           ' GL110301
  2666.              SYSOP.FIRST.NAME$ + _                                   ' GL110301
  2667.              " is not available to answer your page." : _            ' GL110301
  2668.         GOSUB 12979 : _                                              ' GL110301
  2669.         GOTO 4755                                                    ' GL110301
  2670. 4705 CALL QTPUT ("Chat. Remote Conversation",1)
  2671.      JJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
  2672.      IF (JJ > START.OFFICE.HOURS AND JJ < END.OFFICE.HOURS) OR SYSOP.ANNOY THEN _
  2673.         GOTO 4710
  2674. 4707 GOTO 4750
  2675. 4710 A$ = "Page " + _
  2676.           SYSOP.FIRST.NAME$ + _
  2677.           " ([Y]/N)"
  2678.      CALL SKIPLINE (1)
  2679.      GOSUB 12999
  2680.      IF NO THEN _
  2681.         RETURN
  2682.      PAGE.COUNT = 0
  2683.      A$ = "Paging " + _
  2684.           SYSOP.FIRST.NAME$ + _
  2685.           " now"
  2686.      GOSUB 12978
  2687.      CALL SETABORT (PAGE.TIME.MAX!,30)
  2688. 4730 CALL DELAYIT (1)
  2689. 4735 PAGE.COUNT = PAGE.COUNT + 1
  2690.      IF INKEY$ = ESCAPE$ THEN _
  2691.         GOTO 4765
  2692. 4740 IF PAGE.COUNT MOD 2 THEN _
  2693.         A$ = PAGING.PRINTER.SUPPORT$ + _
  2694.              BELL.RINGER$ : _
  2695.         IF LEN(PAGING.PRINTER.SUPPORT$) = 3 THEN _
  2696.            CALL PRINTIT (CHR$(7)) : _
  2697.            IF EC <> 0 THEN _
  2698.               EL = 4740 : _
  2699.               GOTO 13000
  2700. 4745 GOSUB 12978
  2701.      CALL CHECKTIM (PAGE.TIME.MAX!)
  2702.      ON SUBROUTINE.PARAMETER GOTO 4730,4747
  2703. 4747 GOSUB 12979
  2704. 4750 CALL QTPUT(SYSOP.FIRST.NAME$ + " not responding",1)
  2705. 4755 'CALL QTPUT ("Try a msg or comment",1)
  2706.   PAGED.FILE.NAME$ = "PAGED.DEF"             'PAGE MOD
  2707.      CALL BUFFILE (PAGED.FILE.NAME$,X)       'PAGE MOD
  2708.      PAGE.STATUS$ = "Paged!"
  2709.      CALL UPDTCALR ("Operator paged " + LEFT$(TIME$,5),2)
  2710.      RETURN
  2711. 4765 CALL UPDTCALR ("Paged & chatted with Sysop",1)
  2712.      CALL QTPUT ("SYSOP in!  " + _
  2713.           FIRST.NAME$ + _
  2714.           ", this is " + _
  2715.           SYSOP.FIRST.NAME$ + _
  2716.           " go ahead!",1)
  2717.      PAGE.STATUS$ = ""
  2718. 4770 CALL SYSOPCHAT                                                  ' KG102206
  2719.      IF SUBROUTINE.PARAMETER < 0 THEN _                              ' KG102206
  2720.         GOTO 202
  2721.      RETURN                                                          ' KG102206
  2722. '
  2723. ' ****  S - COMMAND FROM UTILITY MENU (STATISTICS)  ****
  2724. '
  2725. 4849 GOSUB 4850         'PE 02/10/89
  2726.     CALL ASKMORE ("",TRUE,FALSE,X,TRUE)   'PE 02/10/89
  2727.      RETURN             'PE 02/10/89
  2728. 4850 GOSUB 1893             '<---- NEW
  2729.         CALL QTPUT (FG.3$+"RBBS-PC " + CX$(4)+VERSION.ID$ +FG.1$+CRLF$+ "NODE " + NODE.ID$ + _
  2730.         CX$(1)+ ", OPERATING AT " +FG.2$+ BAUD.PARITY$,1)
  2731.      A$ = ""
  2732.      IF NOT CONFERENCE.MODE THEN _
  2733.           A$ = "Caller Number................"+STR$(CALLS.TODATE!) + "  "+CRLF$
  2734. 4852 A$ = A$ + "Active Messages.............."+STR$(ACTIVE.MESSAGES)+CRLF$
  2735.      A$ = A$ + "Next Msg Number.............."+STR$(HIGH.MESSAGE.NUMBER + 1)+_
  2736.         CRLF$
  2737.      IF LAST.MESSAGE.READ > 0 THEN _
  2738.      A$ = A$ + "Last msg you read............" + STR$(LAST.MESSAGE.READ)+CRLF$
  2739. 4857 GOSUB 12976
  2740.      IF SYSOP THEN _
  2741.         USER.WORK = (HIGHEST.USER.RECORD * .95) + 1: _
  2742.         A$ = "USERS: used" + _
  2743.              STR$(CURRENT.USER.COUNT - 1) + _
  2744.              " avl" + _
  2745.              STR$(USER.WORK - CURRENT.USER.COUNT) + _
  2746.              "  MSGS: used" + _
  2747.              STR$(ACTIVE.MESSAGES) + _
  2748.              " avl" + _
  2749.              STR$(MAXIMUM.MESSAGES - ACTIVE.MESSAGES) + _
  2750.              "  MSG REC: used" + _
  2751.              STR$(NEXT.MESSAGE.RECORD - 1) + _
  2752.              " avl" + _
  2753.              STR$(HIGHEST.MESSAGE.RECORD + 1 - NODES.IN.SYSTEM - NEXT.MESSAGE.RECORD) : _
  2754.         GOSUB 12976 : _
  2755.         Z$ = UPLOAD.DRIVE.FILE$ : _
  2756.         CALL FINDFREE : _
  2757.         CALL QTPUT ("Upload disk has" + FREE.SPACE$,1)
  2758.         RETURN
  2759.  4900 IF (NOT LOCAL.USER) OR (NOT SYSOP) THEN _                       ' KG101509
  2760.         CALL UPDTCALR ("Entered " + GRN$,1)
  2761.      CALL QTPUT("Welcome to " + GRN$,1)
  2762. 4905 CALL BUFFILE (FILE.NAME$,X)
  2763. 4910 GOSUB 12986
  2764.      GOSUB 5344
  2765.      IF LOF(1) = 0 THEN _
  2766.         DF$ = ACTIVE.MESSAGE.FILE$ : _
  2767.         CLOSE 1 : _
  2768.         KILL ACTIVE.MESSAGE.FILE$ : _
  2769.         GOSUB 12987 : _
  2770.         RETURN 13600
  2771.      GOSUB 23000
  2772.      RETURN
  2773. '
  2774. ' ****  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)  ****
  2775. '
  2776. 5110  CALL NEWPASWRD ("Enter new password" + PRESS.ENTER$,TRUE)       ' KG101501
  2777.      IF SUBROUTINE.PARAMETER < 0 THEN _                              ' KG101501
  2778.         GOTO 202                                                     ' KG101501
  2779.      IF Q = 0 THEN _
  2780.         RETURN                                                       ' KG101501
  2781. 5120 A$ = "Reenter new password"
  2782.      GOSUB 45010
  2783.      IF Q = 0 THEN _
  2784.         RETURN
  2785.      CALL ALLCAPS (B$)
  2786.      IF Z$ <> B$ THEN _
  2787.         A$ = "Passwords don't match!" : _
  2788.         GOSUB 12979 : _
  2789.         RETURN
  2790. 5125 IF MAXIMUM.PASSWORD.CHANGES AND _
  2791.         CHANGES.THIS.SESSION > _
  2792.         MAXIMUM.PASSWORD.CHANGES AND _
  2793.         NOT SYSOP THEN _
  2794.             A$ = "No changes permitted" : _
  2795.             GOSUB 12975 : _
  2796.             RETURN _
  2797.      ELSE PASSWORD.CHANGE.ALLOWED = TRUE : _
  2798.           GOSUB 5140 : _
  2799.           IF NOT FOUND THEN _
  2800.              GOTO 5129 _
  2801.           ELSE A$ = "Temporary change" : _
  2802.                GOSUB 12975 : _
  2803.                PASSWORD$ = TEMP.PASSWORD$ : _
  2804.                SECONDS.PER.SESSION! = TEMP.TIME.ALLOWED * 60 : _
  2805.                USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL : _
  2806.                GOSUB 41070 : _
  2807.                SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL) : _
  2808.                CALL CALLOPT : _
  2809.                CALL XFERTYPE (2,TRUE)
  2810.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2811.         B$(1) = "********"
  2812. 5126 CALL UPDTCALR ("Used temp password " + B$,2)
  2813.      RETURN
  2814. 5129 IF ORIG.USER.FILE$ <> ACTIVE.USER.FILE$ THEN _                  ' KG101605
  2815.         CALL QTPUT ("Password Change only in Logon User File",1) : _ ' KG101605
  2816.         RETURN                                                       ' KG101605
  2817.      GOSUB 12989
  2818.      CALL OPENUSER (HIGHEST.USER.RECORD)
  2819.      GOSUB 9450
  2820. 5130 IF USER.FILE.INDEX < 1 OR _
  2821.         USER.FILE.INDEX > 32767 THEN _
  2822.         GOTO 5160
  2823.      GET 5,USER.FILE.INDEX
  2824.      CALL ALLCAPS (B$)
  2825.      LSET PASSWORD$ = B$
  2826.      GOSUB 9440
  2827.      GOSUB 12991
  2828.      A$ = "Password changed"
  2829.      STOP.INTERRUPTS = TRUE
  2830.      GOSUB 12975
  2831.      IF MAXIMUM.PASSWORD.CHANGES THEN _
  2832.         CHANGES.THIS.SESSION = CHANGES.THIS.SESSION + 1
  2833. 5131 CALL UPDTCALR ("New Password " + B$(1),2)
  2834.      RETURN
  2835. '
  2836. ' ****  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS  ****
  2837. '
  2838. 5135 Z$ = ""
  2839.      Z = 0
  2840.      GOSUB 5140
  2841.      IF FOUND THEN _
  2842.         MINUTES.PER.SESSION! = TEMP.TIME.ALLOWED : _
  2843.         MAX.PER.DAY = -(MAX.PER.DAY * (TEMP.MAX.PER.DAY <= 0)) - _
  2844.                        (TEMP.MAX.PER.DAY * (TEMP.MAX.PER.DAY > 0)) : _
  2845.         TIME.LOCK.SET = TEMP.TIME.LOCK : _
  2846.         IF TEMP.REG.PERIOD > 0 THEN _
  2847.            DAYS.IN.REGISTRATION.PERIOD = TEMP.REG.PERIOD
  2848.      IF LIMIT.MINUTES.PER.SESSION! THEN _
  2849.         IF MINUTES.PER.SESSION! > LIMIT.MINUTES.PER.SESSION! THEN _
  2850.            MINUTES.PER.SESSION! = LIMIT.MINUTES.PER.SESSION!
  2851.      SECONDS.PER.SESSION! = MINUTES.PER.SESSION! * 60
  2852.      RETURN
  2853. 5140 FOUND = FALSE
  2854.      CALL OPENWORK (PASSWORDS.FILE$)
  2855.      IF EC = 53 THEN _
  2856.         CALL UPDTCALR ("Missing file " + PASSWORDS.FILE$,2) : _
  2857.         IF Z = 1 THEN _
  2858.            CALL ALLCAPS (B$(1)) : _
  2859.            Z$ = B$(1) : _
  2860.            GOTO 5160 _
  2861.         ELSE GOTO 5160
  2862.      Z$ = Z$ + _
  2863.           SPACE$(15 - LEN(Z$))
  2864. 5150 IF EOF(2) THEN _
  2865.         GOTO 5160
  2866. 5151 CALL GETPASWD
  2867.      IF EC <> 0 THEN _
  2868.         EL = 5151 : _
  2869.         GOTO 13000
  2870.      IF LEN(TEMP.PASSWORD$) > 15 THEN _
  2871.         GOTO 5150
  2872.      TEMP.PASSWORD$ = TEMP.PASSWORD$ + _
  2873.                       SPACE$(15 - LEN(TEMP.PASSWORD$))
  2874.      IF Z$ <> TEMP.PASSWORD$ THEN _
  2875.         GOTO 5150
  2876.      IF PASSWORD.CHANGE.ALLOWED AND _
  2877.         USER.SECURITY.LEVEL >= MINIMUM.SECURITY.FOR.TEMP.PASSWORD THEN _
  2878.         GOTO 5155
  2879.      IF USER.SECURITY.LEVEL <> TEMP.SECURITY.LEVEL THEN _
  2880.         GOTO 5150
  2881.      IF START.TIME = 0 THEN _
  2882.         GOTO 5155
  2883.      WORK.TIME$ = TIME$
  2884.      TEST.TIME = VAL(LEFT$(WORK.TIME$,2) + MID$(WORK.TIME$,4,2))
  2885.      IF TEST.TIME => START.TIME AND TEST.TIME <= END.TIME THEN _
  2886.         GOTO 5155
  2887.      IF END.TIME < START.TIME THEN _
  2888.         IF TEST.TIME => START.TIME OR TEST.TIME <= END.TIME THEN _
  2889.            GOTO 5155
  2890.      GOTO 5150
  2891. 5155 FOUND = TRUE
  2892. 5160 EC = 0
  2893.      RETURN
  2894. 5200 CALL PAGELEN
  2895.      RETURN
  2896. '
  2897. ' ****  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)  ****
  2898. '
  2899. 5300 A1$ = CONFERENCE.MENU$
  2900.      CALL BRKFNAME (ACTIVE.MESSAGE.FILE$,MSG.DRVPATH$,X$,Y$,TRUE)    ' KG120901
  2901. 5301 CALL SUBMENU ("What conference, L)ist, M)ain ([ENTER] quits)",_
  2902.          A1$,MSG.DRVPATH$,_                                          ' KG120901
  2903.          "M.DEF","M",USER.GRAPHIC.DEFAULT$,TRUE,FALSE,FALSE,"C.DEF") ' KG120501
  2904.      IF Q = 0 THEN _
  2905.         RETURN
  2906.      ACTIVE.USER.NAME$ = ORIG.USER.NAME$                          'DGS-ALS
  2907.      FIRST.NAME$ = ORIG.FIRST.NAME$                               'DGS-ALS
  2908.      IF SUBROUTINE.PARAMETER = -1 THEN _
  2909.         RETURN 10595
  2910. 5323   IF Z$ = "M" OR Z$ = "MAIN" THEN _
  2911.         IF GRN$ = "MAIN" THEN _
  2912.            RETURN _
  2913.         ELSE GOTO 5350
  2914.      ANS.INDEX = 0
  2915.      IF NOT OK THEN _
  2916.         GOTO 5300
  2917.      Q = 0
  2918.      CLOSE 2              'KG102007
  2919. '
  2920. ' ****  UPDATE PREVIOUS MESSAGE BASE CHECKPOINT RECORD  ****
  2921. '
  2922. 5324 PREV.GRN$ = GRN$
  2923.      GRN$ = Z$
  2924.      GRN.NAME$ = GRN$
  2925.      GRN.SAVE$ = GRN$
  2926.      GOSUB 12986
  2927.      GOSUB 5342
  2928.      PREV.MESSAGE$ = ACTIVE.MESSAGE.FILE$
  2929.      ACTIVE.MESSAGE.FILE$ = FILE.NAME$
  2930.      GOSUB 5343
  2931. '
  2932. ' ****  UPDATE PREVIOUS USER RECORD  ****
  2933. '
  2934. 5325 GOSUB 5380
  2935. '
  2936. ' *****  CHECK WHETHER HAVE SUBBORD (I.E. CONFIG.DEF EXISTS)  *****
  2937. '
  2938. 5327 USER.RECORD.HOLD$ = USER.RECORD$
  2939.      CONFERENCE.MODE.SAVE = CONFERENCE.MODE
  2940.      CONFERENCE.MODE = TRUE
  2941.      X$ = GRN$ + _
  2942.           "C.DEF"
  2943.      PREV.USER$ = ACTIVE.USER.FILE$
  2944.      PREV.INDEX = USER.FILE.INDEX
  2945.      PREV.MAIN.USER$ = MAIN.USER.FILE$
  2946.      IF ORIG.CONFIG$ = CURRENT.DEF$ THEN _                           ' KG110702
  2947.         ORIG.SECURITY = USER.SECURITY.LEVEL                          ' KG110702
  2948.      PREV.DEF$ = CURRENT.DEF$
  2949.      CALL FINDIT (X$)
  2950.      SUB.BOARD = OK
  2951.      IF NOT SUB.BOARD THEN _
  2952.      CALL BRKFNAME (MAIN.MESSAGE.FILE$,MSG.DRVPATH$,DF$,Y$,TRUE) : _ ' KG121101
  2953.         X$ = MSG.DRVPATH$ + X$ : _                                   ' KG120902
  2954.         CALL FINDIT (X$) : _
  2955.         SUB.BOARD = OK
  2956.      IF SUB.BOARD THEN _
  2957.         IF LEN(GRN$) = 7 THEN _
  2958.            IF LEFT$(GRN$,4) = "RBBS" AND RIGHT$(GRN$,2) = "PC" THEN _
  2959.               SUB.BOARD = FALSE
  2960.      IF NOT SUB.BOARD THEN _
  2961.         X$ = MID$(ACTIVE.USER.FILE$,1,2) + _
  2962.              GRN$ + _
  2963.              "U.DEF" : _
  2964.         FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  2965.                      GRN$ + _
  2966.                      "W.DEF" _
  2967.         ELSE CALL READDEF (X$) : _
  2968.              IF EC > 0 THEN _
  2969.          CALL UPDTCALR ("Error"+STR$(EC)+" reading config file "+X$,2) : _
  2970.                 EC = 0 : _
  2971.                 IN.CONF.MENU = FALSE : _
  2972.                 A$ = "error reading subboard" : _                    ' KG102504
  2973.                 GOTO 5341 _
  2974.              ELSE X$ = MAIN.USER.FILE$ : _
  2975.                   FILE.NAME$ = "" : _                                ' KG121003
  2976.                   CALL FINDIT (MAIN.MESSAGE.FILE$) : _               ' KG121003
  2977.                   IF NOT OK THEN _                                   ' KG121003
  2978.                      A$ = "msg file missing for" : _                 ' KG121003
  2979.                      IN.CONF.MENU = FALSE : _                        ' KG121003
  2980.                      GOTO 5341 _                                     ' KG121003
  2981.                   ELSE ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _ ' KG121003
  2982.                        GOSUB 5343                                    ' KG121003
  2983.      UPDATE.DATE = TRUE
  2984.      CALL FINDIT (X$)
  2985.      IF OK THEN _
  2986.         GOTO 5330
  2987. '
  2988. ' *****  NO USER FILE - A PUBLIC CONFERENCE   *****
  2989. '
  2990.      MAIN.USER.FILE$ = PREV.MAIN.USER$
  2991.      IF (USER.SECURITY.LEVEL < AUTO.ADD.SECURITY) THEN _
  2992.         GOTO 5340                                         'KG102504
  2993.      X$ = MAIN.USER.FILE$
  2994.      SYSOP.PASSWORD.1$ = ""
  2995.      SYSOP.PASSWORD.2$ = ""
  2996. '
  2997. ' ****  CHECK CONFERENCE USER'S FILE  ****
  2998. '
  2999. 5330 ACTIVE.USER.FILE$ = X$
  3000.      IF MAIN.USER.FILE.INDEX < 1 THEN _
  3001.         FOUND = FALSE : _
  3002.         USER.FILE.INDEX = 0 : _
  3003.         GOTO 5335                                              'KG120504
  3004.      CALL WORDINFILE (CONFERENCE.MENU$,GRN$,IN.CONF.MENU)
  3005.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  3006.         TEMP.HASH.VALUE$ = ORIG.USER.NAME$
  3007.      GOSUB 12600       'was updated to 12598 in 17D  'KG010701
  3008.      GOSUB 12984
  3009. 5335 IF FOUND THEN _                                                 ' KG102504
  3010.         GOSUB 9500 : _
  3011.         MAIN.USER.FILE.INDEX = -(SUB.BOARD * USER.FILE.INDEX)_
  3012.                                -((NOT SUB.BOARD) * MAIN.USER.FILE.INDEX) : _
  3013.         IF USER.SECURITY.LEVEL < ORG.MIN.SEC  THEN _                 ' KG011501
  3014.            A$ = "you have been locked out of" : _                    ' KG102001
  3015.            GOTO 5341 _                                               ' KG101502
  3016.         ELSE GOTO 5345                                               ' KG101502
  3017. '
  3018. ' **** USER NOT FOUND.  AUTO-ADD TO SUBBORAD IF SUFFICIENT SECURITY ****
  3019. '
  3020.      IF SUB.BOARD THEN _
  3021.         AUTO.ADD.SECURITY = MINIMUM.LOGON.SECURITY
  3022.      IF (USER.SECURITY.LEVEL >= AUTO.ADD.SECURITY) AND _
  3023.         (USER.FILE.INDEX > 0) AND (MAIN.USER.FILE.INDEX > 0) THEN _
  3024.            CALL QTPUT("MEMBER privileges granted in conference " + GRN$,1) : _
  3025.            LSET USER.RECORD$ = USER.RECORD.HOLD$ : _
  3026.            MID$(USER.OPTIONS$,3,2) = MKI$(0) : _
  3027.            MID$(USER.OPTIONS$,1,2) = MKI$(0) : _
  3028.            ACTIVE.USER.NAME$ = LEFT$(USER.RECORD.HOLD$,30) : _
  3029.            CALL TRIM (ACTIVE.USER.NAME$) : _
  3030.            TEMP = -(SUB.BOARD * ORIG.SECURITY) _                 ' KG110702
  3031.                   -((NOT SUB.BOARD) * USER.SECURITY.SAVE) : _
  3032.            GOSUB 5370 : _
  3033.            TEMP = -(A * SYSOP.SECURITY.LEVEL) - ((NOT A) * TEMP) : _
  3034.            LSET SECURITY.LEVEL$ = MKI$(TEMP) : _
  3035.            USER.SECURITY.LEVEL = TEMP : _
  3036.            GOSUB 12986 : _
  3037.            GOSUB 12630 : _
  3038.            UPDATE.DATE = TRUE : _
  3039.            FOUND = TRUE : _
  3040.            GOTO 5335 _                                               ' KG102504
  3041.      ELSE IF USER.SECURITY.LEVEL >= AUTO.ADD.SECURITY THEN _
  3042.              CALL QTPUT("GUEST privileges granted in conference " + GRN$,1) : _
  3043.              ACTIVE.USER.FILE$ = PREV.USER$ : _
  3044.              UPDATE.DATE = FALSE : _
  3045.              USER.FILE.INDEX = PREV.INDEX : _
  3046.              GOSUB 5382 : _
  3047.              GOTO 5345
  3048. 5340 IF IN.CONF.MENU THEN _                                          ' KG102504
  3049.         A$ = "you are not in conference" _                           ' KG102001
  3050.      ELSE A$ = "no such option"                                      ' KG102001
  3051. 5341 A$ = A$ + " " + GRN$                                            ' KG102001
  3052. '
  3053. ' ****  CANNOT JOIN THE REQUESTED CONFERENCE.  THEREFORE, GO BACK  ****
  3054. '
  3055.      GOSUB 1397
  3056.      GRN$ = PREV.GRN$
  3057.      GRN.NAME$ = GRN$
  3058.      IF SUB.BOARD THEN _
  3059.         CALL READDEF (PREV.DEF$)
  3060.      ACTIVE.MESSAGE.FILE$ = PREV.MESSAGE$
  3061.      GOSUB 5343
  3062.      USER.FILE.INDEX = PREV.INDEX
  3063.      ACTIVE.USER.FILE$ = PREV.USER$
  3064.      GOSUB 5382
  3065.      CONFERENCE.MODE = CONFERENCE.MODE.SAVE                  'KG101606
  3066.      GOSUB 12987
  3067.      ANS.INDEX = 0
  3068.      GOTO 5301
  3069. '
  3070. ' ****  UPDATE POINTERS FOR A MESSAGE BASE   ****
  3071. '
  3072. 5342 GOSUB 12986
  3073.      GOSUB 5344
  3074.      GET 1,1
  3075.      GOSUB 24000
  3076.      GOSUB 12985
  3077.      RETURN
  3078. '
  3079. ' ****  RESTORE A MESSAGE BASE   ****
  3080. '
  3081. 5343 GOSUB 5344
  3082.      GOSUB 23000
  3083.      RETURN
  3084. '
  3085. ' *****  OPEN AND SETUP MESSAGE BASE  *****
  3086. '
  3087. 5344 CALL OPENMSG
  3088.      IF EC = 64 THEN _
  3089.         EC = 0 : _
  3090.         GOTO 5350
  3091.      FIELD 1, 128 AS MESSAGE.RECORD$
  3092.      RETURN
  3093. '
  3094. ' *****  SUCCESSFUL CONFERENCE JOIN  ****  
  3095. '
  3096. 5345 DGS.STL$ = ""                                                'DGS-ALS
  3097.      WHILE DGS.ALIAS$ = ""                                        'DGS-ALS
  3098.     CALL DGSALIAS (GRN$,ORIG.USER.NAME$,DGS.ALIAS$, _         'DGS-ALS
  3099.                DGS.STL$,DGS.FILE.NAME$)                   'DGS-ALS
  3100.      WEND                                                         'DGS-ALS
  3101.      DGS.ALIAS$=""                                                'DGS-ALS 
  3102.     GRN$ = GRN$ + " " + MID$("ConferenceSubboard",1-10*SUB.BOARD,10)
  3103.      IF UPDATE.DATE THEN _
  3104.         BOARD.CHECK.DATE$ = LAST.DATE.TIME.ON$ : _
  3105.         LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  3106.                                   " " + _
  3107.                                   TIME.LOGGED.ON$ : _
  3108.         GOSUB 9440 : _
  3109.         GOSUB 12991
  3110.      IF GLOBAL.SYSOP THEN _
  3111.         ACTIVE.USER.NAME$ = "SYSOP"
  3112. 5347 GOSUB 4900
  3113. 5348 GOSUB 12987
  3114.      GOSUB 12990
  3115.      IF SUB.BOARD THEN _
  3116.       HAS.DOORED = FALSE : _                                         'KG101201
  3117.         ACTIVE.FMS.DIRECTORY$ = "" : _
  3118.         RETURN 108 _
  3119.          ELSE RETURN 852
  3120. 'CODE BELOW is17D code remove the "_" after 108 and
  3121. 'take out the else return
  3122. '
  3123.  '    IF UPDATE.DATE THEN _                                           ' KG011601
  3124.  '       BOARD.CHECK.DATE$ = LAST.DATE.TIME.ON$ : _                   ' KG011601
  3125.  '       LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _                  ' KG011601
  3126.  '                                 " " + _                            ' KG011601
  3127.  '                                 TIME.LOGGED.ON$ : _                ' KG011601
  3128.  '       GOSUB 9440 : _                                               ' KG011601
  3129.  '       GOSUB 12991                                                  ' KG011601
  3130.  '    RETURN 852                                                      ' KG011601
  3131. '
  3132. ' ****  JOIN M)AIN   ****
  3133. '
  3134. 5350 IF GRN$ <> "MAIN" THEN _
  3135.         CALL QTPUT ("Rejoining " + ORIG.MSG.NAME$,1)
  3136.      ACTIVE.USER.NAME$ = ORIG.USER.NAME$                          'DGS-ALS
  3137.      FIRST.NAME$ = ORIG.FIRST.NAME$                               'DGS-ALS
  3138.      UPLOADS = GLOBAL.UPLOADS                                        ' KG102005
  3139.      DOWNLOADS = GLOBAL.DOWNLOADS                                    ' KG102005
  3140.      DL.TODAY! = GLOBAL.DL.TODAY!                                    ' KG102005
  3141.      BYTES.TODAY! = GLOBAL.BYTES.TODAY!                              ' KG102005
  3142.      DLBYTES! = GLOBAL.DLBYTES!                                      ' KG102005
  3143.      ULBYTES! = GLOBAL.ULBYTES!                                      ' KG102005
  3144.      GRN$ = "MAIN"
  3145.      GRN.NAME$ = ORIG.MSG.NAME$
  3146.      TURBO.LOGON = TRUE
  3147.      Q = 0
  3148.      IN.CONF.MENU = TRUE
  3149.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  3150.         ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  3151.      CONFIG.FILENAME$ = ORIG.CONFIG$
  3152.      CALL READDEF (CONFIG.FILENAME$)
  3153.      IF MAIN.MESSAGE.FILE$ <> ACTIVE.MESSAGE.FILE$ THEN _
  3154.         GOSUB 5342 : _
  3155.         ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  3156.         GOSUB 5343
  3157.      IF MAIN.USER.FILE$ <> ACTIVE.USER.FILE$ THEN _
  3158.         GOSUB 5380 : _
  3159.         ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  3160.         GOSUB 12598 : _
  3161.         GOSUB 12990 : _
  3162.         IF FOUND THEN _
  3163.            GOSUB 9500 : _
  3164.            MAIN.USER.FILE.INDEX = USER.FILE.INDEX : _
  3165.            CALL CALLOPT : _
  3166.            CALL XFERTYPE (2,TRUE) _
  3167.         ELSE USER.FILE.INDEX = 0 : _
  3168.              MAIN.USER.FILE.INDEX = 0
  3169.      IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  3170.         CALL UPDTCALR ("Exited Conference",1)
  3171.      GOSUB 2350
  3172. 5360 CONFERENCE.MODE = FALSE
  3173.      SUB.BOARD = TRUE
  3174.      GOSUB 12987
  3175.      RETURN 108
  3176. 5370 A = (ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$)
  3177.      GLOBAL.SYSOP = (GLOBAL.SYSOP OR (A AND ORIG.CONFIG$ = CONFIG.FILENAME$))
  3178.      IF GLOBAL.SYSOP THEN _                                          ' KG101203
  3179.         A = TRUE                                                     ' KG101203
  3180.      RETURN
  3181. '
  3182. ' *****  UPDATE CURRENT USERS RECORD  *****
  3183. '
  3184. 5380 IF USER.FILE.INDEX < 1 THEN _
  3185.         RETURN
  3186.      IF ADJUSTED.SECURITY AND NOT SYSOP THEN _
  3187.         LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  3188.         USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  3189.      IF SUB.BOARD THEN _                                          'DGS-ALS
  3190.     ACTIVE.USER.NAME$ = ORIG.USER.NAME$ : _                   'DGS-ALS
  3191.     FIRST.NAME$ = ORIG.FIRST.NAME$                            'DGS-ALS
  3192.     CALL UPDATEU (FALSE)                   ' KG102202
  3193.      RETURN
  3194. '
  3195. ' *****  RESTORE A USER RECORD  *****
  3196. '
  3197. 5382 IF USER.FILE.INDEX < 1 THEN _
  3198.         USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL : _
  3199.         RETURN
  3200.      CALL OPENUSER (HIGHEST.USER.RECORD)
  3201.      GET 5,USER.FILE.INDEX
  3202.      GOSUB 9500
  3203.      RETURN
  3204. '
  3205. ' *****  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)  *****
  3206. '
  3207. 5400 CALL QTPUT (CHR$(12),0)                  'PE CLS MOD
  3208.      CALL QTPUT ("Your PROFILE .......",1)
  3209. 5410 CALL TOGGLE(-9)
  3210.      GOSUB 43020
  3211.      FF = INSTR(DFLTXFER$,USER.TRANSFER.DEFAULT$)
  3212.      CALL TOGGLE(-5)
  3213.      GOSUB 42810
  3214.      CALL TOGGLE(-3)
  3215.      CALL TOGGLE(-6)
  3216.      CALL TOGGLE(-7)
  3217.      CALL TOGGLE(-10)
  3218.      CALL TOGGLE(-2)
  3219.      CALL TOGGLE(-4)
  3220.      CALL TOGGLE(-8)
  3221.      CALL TOGGLE(-1)
  3222.      IF RESTRICT.BY.DATE THEN _
  3223.         IF USER.SECURITY.LEVEL > EXPIRED.SECURITY THEN _
  3224.            CALL QTPUT ("Registration expires " + EXPIRATION.DATE$,1)
  3225.        CALL ASKMORE ("",TRUE,FALSE,X,TRUE)
  3226.      RETURN
  3227. 5450 CALL QTPUT (CHR$(12),0)
  3228.      CALL QTPUT ("Your Current setup...",1)
  3229.      CALL QTPUT (FG.1$ +"USER NAME : " + ACTIVE.USER.NAME$,1)
  3230.       CALL QTPUT (FG.2$ +"SECURITY  :" + STR$(USER.SECURITY.SAVE),1)
  3231.       CALL QTPUT (FG.4$+"PASSWORD  :" + PASSWORD.SAVE$,1)
  3232.       CALL QTPUT (FG.3$+"READ MSG. :" + STR$(LAST.MESSAGE.READ),1)
  3233.       CALL QTPUT (CX$(7)+"TIMES ON  :" + STR$(TIMES.LOGGED.ON),1)
  3234.       CALL QTPUT (FG.1$+"LAST ON   : " + LAST.DATE.TIME.ON.SAVE$,1)
  3235.       CALL QTPUT (FG.4$+"DOWNLOADS :" + STR$(DOWNLOADS),1)
  3236.       CALL QTPUT ("UPLOADS   :" + STR$(UPLOADS),1)
  3237.       CALL QTPUT (FG.2$+"DL-BYTES  :" + STR$(DLBYTES!),1)
  3238.       CALL QTPUT ("UL-BYTES  :" + STR$(ULBYTES!),1)
  3239.       IF RESTRICT.BY.DATE THEN _
  3240.          CALL QTPUT (CX$(7)+"EXPIRATION: " + EXPIRATION.DATE$,1)
  3241.       CALL QTPUT (CX$(5)+"USER MODE : "+MID$("NoviceExpert",1 -6 * EXPERT.USER,6),1)
  3242.       CALL QTPUT (CX$(6)+"GRAPHICS  : " +   MID$("None AsciiColor",GR * 5 + 1,5),1)
  3243.       CALL QTPUT (FG.3$+"PROTOCOL  : " +  USER.TRANSFER.DEFAULT$,1)
  3244.       CALL QTPUT (FG.1$+"UPPER CASE: " +  MID$("and lowerONLY", 1 - 9 * UPPER.CASE,9),1)
  3245.       CALL QTPUT (CX$(8)+"Line Feeds: " + FNOFFON$(LINE.FEEDS),1)
  3246.       CALL QTPUT (CX$(7)+"Nulls     : " + FNOFFON$(NULLS),1)
  3247.       CALL TOGGLE (-8)
  3248.       CALL TOGGLE (-5)
  3249.       CALL TOGGLE (-10)
  3250.       CALL TOGGLE (-2)
  3251.       CALL TOGGLE (-4)
  3252. CALL ASKMORE ("",TRUE,FALSE,X,TRUE)
  3253. RETURN
  3254. '
  3255. ' *****  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)  *****
  3256. '
  3257. 5500  RETURN                                                           'Vote
  3258. 5502 RETURN 10595  'Entry point when have double nested gosub
  3259. '
  3260. ' *****  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)  *****
  3261. '
  3262. 5800 A$ = "Check Conference/Sub-board mail ? ([Y]/N)"   'Pe 01/26/89
  3263.      CALL SKIPLINE (2)                                  'Pe 01/26/89
  3264.      GOSUB 12999                                        'Pe 01/26/89
  3265.      CALL SKIPLINE (2)                                  'Pe 01/27/89
  3266.      IF NO THEN _                                       'Pe 01/26/89
  3267.         RETURN                                          'Pe 01/26/89
  3268.      CALL CONFMAIL
  3269. CALL ASKMORE ("",TRUE,FALSE,X,TRUE)
  3270.      RETURN
  3271. '
  3272. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY
  3273. '
  3274. 8000 IF RET THEN _
  3275.         RETURN
  3276. 8020  MSG.RECEIVED = FALSE                    'BK012501
  3277.        IF MID$(MESSAGE.RECORD$,37,5) = "ALL  " THEN _
  3278.         MESSAGE.TO$ = "ALL" : _
  3279.         GOTO 8040
  3280. 8030 MESSAGE.TO$ = MID$(MESSAGE.RECORD$,37,22)
  3281.      CALL TRIM (MESSAGE.TO$)
  3282. 8040 IF LEN(MESSAGE.TO$) < 23 THEN _
  3283.         MESSAGE.TO$ = MESSAGE.TO$ + _
  3284.                       SPACE$(23 - LEN(MESSAGE.TO$))
  3285.      SUBJECT$ = MID$(MESSAGE.RECORD$,76,25)
  3286.      CALL TRIM (SUBJECT$)
  3287.      ORIG.SUBJECT$ = SUBJECT$                                    ' KG110501
  3288.      IF PASSWORD.FAILED THEN _
  3289.         SUBJECT$ = SJ$
  3290. 8050 MESSAGE.FROM$ = MID$(MESSAGE.RECORD$,6,31)
  3291.      CALL TRIM (MESSAGE.FROM$)
  3292.      IF LEN(MESSAGE.FROM$) < 23 THEN _
  3293.         MESSAGE.FROM$ = MESSAGE.FROM$ + _
  3294.                         SPACE$(23 - LEN(MESSAGE.FROM$))
  3295.      IF USER.SECURITY.LEVEL >= SEC.CHANGE.MSG THEN _
  3296.         YY$ = "  Security:" + _
  3297.               STR$(MESSAGE.SECURITY) _
  3298.         ELSE YY$ = ""
  3299.      A$ = FG.1$ + "Msg #: " + _
  3300.           LEFT$(MESSAGE.RECORD$,5) + _
  3301.           + YY$
  3302.      YY$ = FG.4$ + "   Sent: " + _
  3303.           MID$(MESSAGE.RECORD$,68,8) + _
  3304.           " " + _
  3305.           MID$(MESSAGE.RECORD$,59,5)
  3306.      IF NOT RET THEN _
  3307.         IF READ.MESSAGES THEN _
  3308.            CALL QTPUT (A$,1): _
  3309.            X$ = MESSAGE.FROM$ : _
  3310.            CALL CHKCOLOR (X$,SEARCH.HEADER$,FG.2$) : _
  3311.            CALL QTPUT (FG.2$ + " From:  " + X$ + YY$,1) : _
  3312.            GOSUB 8076 : _
  3313.            X$ = MESSAGE.TO$ : _
  3314.            CALL CHKCOLOR (X$,SEARCH.HEADER$,FG.3$) : _
  3315.            CALL QTPUT (FG.3$ + "   To:  " + X$ + "  " + FG.2$ + YY$,1) : _
  3316.            CALL CHKCOLOR (SUBJECT$,SEARCH.HEADER$,FG.4$) : _
  3317.            A$ = FG.4$ + "   Re:  " + _
  3318.              SUBJECT$  _                   ' EMPHASIZE.OFF$ remove Pe 03/23/89
  3319.         ELSE A$ = FG.1$ + LEFT$(MESSAGE.RECORD$,5) + _
  3320.                   " " + _
  3321.                   MID$(MESSAGE.RECORD$,68,5) + _
  3322.                   " " + _
  3323.                   + FG.2$ + LEFT$(MESSAGE.FROM$,18) + _
  3324.                   " -> " + _
  3325.                   + FG.3$ + LEFT$(MESSAGE.TO$,19) + _
  3326.                   " " + _
  3327.                   + FG.4$ + LEFT$(SUBJECT$,24) + EMPHASIZE.OFF$ : _
  3328.              CALL CHKCOLOR (A$,SEARCH.HEADER$,"") : _
  3329.              GOTO 8080
  3330.      IF QUICK.SCAN.MESSAGES OR _
  3331.         SCAN.MESSAGES THEN _                                         ' TF041203
  3332.            GOTO 8080 _
  3333.      ELSE GOTO 8077
  3334. 8076 IF MID$(MESSAGE.RECORD$,123,6) = STRING$(6,0) OR _
  3335.         MID$(MESSAGE.RECORD$,123,6) = SPACE$(6) THEN _
  3336.            YY$ = " Rcvd: -NO-" : _
  3337.            MSG.RECEIVED = FALSE : _                'BK012501
  3338.            RETURN
  3339.      YY$ = " Rcvd: " + _
  3340.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,123,1))),2) + _
  3341.            "-" + _
  3342.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,124,1))),2) + _
  3343.            "-" + _
  3344.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,125,1))),2) + _
  3345.            " " + _
  3346.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,126,1))),2) + _
  3347.            ":" + _
  3348.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,127,1))),2)
  3349.      MSG.RECEIVED = TRUE                    'BK012501
  3350.      FOR I = 8 TO 15
  3351.         IF MID$(YY$,I,1) = " " THEN _
  3352.            MID$(YY$,I,1) = "0"
  3353.      NEXT
  3354.      FOR I = 17 TO 21
  3355.         IF MID$(YY$,I,1) = " " THEN _
  3356.            MID$(YY$,I,1) = "0"
  3357.      NEXT
  3358.      RETURN
  3359. 8077 IF (NOT MSG.TO.CALLER) THEN _                                   ' KG012101
  3360.         A = (MID$(MESSAGE.RECORD$,37,5) = "ALL  ") : _               ' KG012101
  3361.         IF NOT A THEN _                                              ' KG012101
  3362.            GOTO 8080                                                 ' KG012101
  3363.      IF MSG.FROM.CALLER THEN _                                       ' KG112501
  3364.         GOTO 8080                                                    ' KG112501
  3365.      YY$ = DATE$
  3366.      WK$ = TIME$
  3367.      MID$(MESSAGE.RECORD$,123,6) = CHR$(VAL(MID$(YY$,1,2))) + _
  3368.                                    CHR$(VAL(MID$(YY$,4,2))) + _
  3369.                                    CHR$(VAL(MID$(YY$,9,2))) + _
  3370.                                    CHR$(VAL(MID$(WK$,1,2))) + _
  3371.                                    CHR$(VAL(MID$(WK$,4,2))) + _
  3372.                                    CHR$(VAL(MID$(WK$,7,2)))
  3373.      GOSUB 12986
  3374.      PUT 1,M(MESSAGE.DIM.INDEX,1)
  3375.      GOSUB 12987
  3376. 8080 GOSUB 12979
  3377.      A$ = ""
  3378.      RETURN
  3379. '
  3380. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY
  3381. '
  3382. 9000 IF NOT JUST.SEARCHING THEN _
  3383.         CALL SKIPLINE (1) : _
  3384.         LINES.IN.MESSAGE = 1 : _                'BK010501
  3385.         ADIMX = 150 : _                        'BK010901
  3386.         REDIM A$(ADIMX) : _                    'BK010901
  3387.         REMAIN$ = "" : _                    'BK010701
  3388.         IF QUOTED.REPLY = FALSE THEN _                'BK012405
  3389.            DONT.PRINT = FALSE                    'BK012405
  3390.      FOR X = 2 TO VAL(MID$(MESSAGE.RECORD$,117,4))
  3391.            J = 1
  3392.         GET 1
  3393.         IF JUST.SEARCHING THEN _
  3394.            A$ = MESSAGE.RECORD$ : _
  3395.            CALL ALLCAPS (A$) : _
  3396.            HIGHLITE.POS = INSTR(A$,SEARCH.STRING$) : _
  3397.            IF HIGHLITE.POS > 0 THEN _
  3398.               HIGHLITE.REC = LOC(1) : _
  3399.               X = 9999 : _
  3400.               GOTO 9090 _
  3401.            ELSE GOTO 9090
  3402. 9050    B = INSTR(J,MESSAGE.RECORD$,CHR$(227))
  3403.         C = B - J
  3404.         IF C < 0 THEN _
  3405.            C = 128 : _
  3406.            EOL = TRUE
  3407. 9070    A$ = MID$(MESSAGE.RECORD$,J,C)
  3408.         IF HIGHLITE.REC = LOC(1) THEN _
  3409.            IF HIGHLITE.POS >= J AND HIGHLITE.POS < J+C THEN _
  3410.               HIGHLITE.REC = -1 : _
  3411.  CALL BRACKET  (A$,HIGHLITE.POS-J+1,HIGHLITE.POS+LEN(SEARCH.STRING$)-J,EMPHASIZE.ON$,EMPHASIZE.OFF$)  ' JM110802
  3412.         IF B = 0 THEN _                        'BK010701
  3413.            REMAIN$ = A$ : _                    'BK010701
  3414.            GOTO 9090 _                        'BK010701
  3415.         ELSE _                            'BK010701
  3416.            A$ = REMAIN$ + A$ : _                'BK010701
  3417.            REMAIN$ = "" : _                    'BK010701
  3418.            J = B + 1                        'BK010701
  3419. 9085    IF LEFT$(A$,1) = CHR$(1) OR _                'BK010701
  3420.            LEFT$(A$,9) = "SEEN-BY: " THEN _            'BK010701
  3421.            GOTO 9050                        'BK010701
  3422.         A$(LINES.IN.MESSAGE) = A$                'BK010702
  3423.         LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1            'BK010501
  3424.         IF LINES.IN.MESSAGE > ADIMX THEN _            'BK010901
  3425.            LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _        'BK010901
  3426.            CALL SKIPLINE (1) : _                'BK010901
  3427.            CALL QTPUT ("Message too long.  Truncated to " + STR$(ADIMX) + " lines!",1) : _    'BK010901
  3428.            A$ = "" : _                        'BK010901
  3429.            RETURN                        'BK010901
  3430.         IF DONT.PRINT = FALSE THEN _                'BK010501
  3431.            CALL QTPUT (A$,1) : _                'BK010702
  3432.            IF RET THEN _                    'BK010701
  3433.               A$ = "" : _                    'BK010701
  3434.               RETURN                        'BK010701
  3435.            CALL ASKMORE ("",TRUE,TRUE,MESSAGES.SELECTED.INDEX,FALSE)
  3436.            IF NO THEN _
  3437.               DONT.PRINT = TRUE                    'BK010501
  3438.         GOTO 9050
  3439. 9090 NEXT
  3440.      IF DONT.PRINT = TRUE THEN _                'BK010501
  3441.         GOTO 5160                        'BK010501
  3442.      IF JUST.SEARCHING AND HIGHLITE.POS > 0 THEN _
  3443.         JUST.SEARCHING = FALSE : _
  3444.         GET 1,M(MESSAGE.DIM.INDEX,1) : _
  3445.         GOSUB 8000 : _
  3446.         GOTO 9000
  3447.      A$ = ""
  3448.      RETURN
  3449. '
  3450. ' *  C - COMMAND FROM UTILITY MENU (CLOCK - TIME ON SYSTEM)
  3451. '
  3452. 9099 GOSUB 9100                          'Pe 02/11/89
  3453.      CALL ASKMORE ("",TRUE,FALSE,X,TRUE) 'Pe 02/11/89
  3454.      RETURN                              'PE 02/11/89
  3455. 9100 CALL RPTTIME
  3456.      RETURN
  3457. '
  3458. ' * WRITE A RECORD TO THE RBBS-PC "USER" FILE 
  3459. '
  3460. 9440 IF USER.FILE.INDEX > 0 AND USER.FILE.INDEX < 32768 THEN _
  3461.         PUT 5,USER.FILE.INDEX
  3462.      RETURN
  3463. '
  3464. ' * DEFINE USER FILE RECORD VARIABLES TO COMPENSATE FOR THE BUG IN QUICKBASIC *
  3465. ' * THAT REQUIRES A FIELD STATMENT TO BE EXECUTED WITHIN EACH SEPARATELY      *
  3466. ' * COMPILED PROGRAM -- EVEN THOUGH A FIELD STATEMENT WAS EXECUTED WHEN THE   *
  3467. ' * FILE WAS OPENED IN ANOTHER SEPERATELY COMPILED SUBROUTINE                 *
  3468. '
  3469. 9450 IF LOF(5) < 1 THEN _
  3470.         DF$ = ACTIVE.USER.FILE$ : _
  3471.         RETURN 13600
  3472.      FIELD 5,31 AS USER.NAME$, _
  3473.              15 AS PASSWORD$, _
  3474.               2 AS SECURITY.LEVEL$, _
  3475.              14 AS USER.OPTIONS$,  _
  3476.              24 AS CITY.STATE$, _
  3477.               3 AS MACHINE.TYPE$, _
  3478.               4 AS TODAY.DL$, _
  3479.               4 AS TODAY.BYTES$, _
  3480.               4 AS DL.BYTES$, _
  3481.               4 AS UL.BYTES$, _
  3482.              14 AS LAST.DATE.TIME.ON$, _
  3483.               3 AS LIST.NEW.DATE$, _
  3484.               2 AS USER.DOWNLOADS$, _
  3485.               2 AS USER.UPLOADS$, _
  3486.               2 AS ELAPSED.TIME$
  3487.      FIELD 5,128 AS USER.RECORD$
  3488.      RETURN
  3489. '
  3490. ' * GET USER DEFAULTS
  3491. '
  3492. 9500 GOSUB 9450
  3493.      GOSUB 5370
  3494.      IF A THEN _
  3495.         USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL _
  3496.      ELSE USER.SECURITY.LEVEL = CVI(SECURITY.LEVEL$)
  3497.      LAST.MESSAGE.READ = CVI(MID$(USER.OPTIONS$,3,2))
  3498.      USER.TRANSFER.DEFAULT$ = MID$(USER.OPTIONS$,5,1)
  3499.      IF USER.TRANSFER.DEFAULT$ = " " THEN _
  3500.         USER.TRANSFER.DEFAULT$ = "N"
  3501.      CALL XFERTYPE (2,TRUE)
  3502.      X = ASC(MID$(USER.OPTIONS$,6,1))
  3503.      GR = (X MOD 3)
  3504.      BOLD.TEXT$ = CHR$(48 - (X > 50))
  3505.      USER.TEXT.COLOR = (X - GR)/3 + 21
  3506.      IF USER.TEXT.COLOR > 37 THEN _
  3507.         USER.TEXT.COLOR = USER.TEXT.COLOR - 7
  3508.      IF EMPHASIZE.OFF$ <> "" THEN _
  3509.         CALL QTPUT (COLOR.RESET$,0)
  3510.      IF EMPHASIZE.ON.DEF$ <> "" THEN _
  3511.         EMPHASIZE.OFF$ = ESCAPE$ + "[" + BOLD.TEXT$ + ";40;" + MID$(STR$(USER.TEXT.COLOR),2) + "m" _
  3512.      ELSE EMPHASIZE.OFF$ = ""
  3513.      IF GR = 1 AND NOT EIGHT.BIT THEN _
  3514.         GR = 0
  3515.      CALL SETUGD (GR, USER.GRAPHIC.DEFAULT$)
  3516.      CALL GETCOLOR
  3517.      RIGHT.MARGIN = CVI(MID$(USER.OPTIONS$,7,2))
  3518.      IF RIGHT.MARGIN > 72 THEN _
  3519.         RIGHT.MARGIN = 72
  3520. 9510 USER.OPTIONS = CVI(MID$(USER.OPTIONS$,9,2))
  3521.      PROMPT.BELL = (USER.OPTIONS AND 1) > 0
  3522.      EXPERT.USER = (USER.OPTIONS AND 2) > 0
  3523.      CALL SETEXPERT
  3524.      NULLS = (USER.OPTIONS AND 4) > 0
  3525.      UPPER.CASE = (USER.OPTIONS AND 8) > 0
  3526.      LINE.FEEDS = (USER.OPTIONS AND 16) > 0
  3527.      CHECK.BULLETIN.LOGON = (USER.OPTIONS AND 32) > 0
  3528.      SKIP.FILES.LOGON = (USER.OPTIONS AND 64) > 0
  3529.      AUTODOWNLOAD.DESIRED = (USER.OPTIONS AND 128) > 0
  3530.      REQ.QUES.ANSWERED = (USER.OPTIONS AND 256) > 0
  3531.      MAIL.WAITING = (USER.OPTIONS AND 512) > 0
  3532.      X = (USER.OPTIONS AND 1024 ) > 0
  3533.      CALL SETHILITE (NOT X)
  3534.      IF NOT HIGHLIGHT.OFF THEN _
  3535.         CALL QTPUT (EMPHASIZE.OFF$,0)
  3536.      TURBO.KEY.USER = (USER.OPTIONS AND 2048) > 0
  3537.      TURBO.KEY = FALSE
  3538.      GOSUB 11480
  3539.      PAGE.LENGTH = ASC(MID$(USER.OPTIONS$,13,1))
  3540.      IF SUB.BOARD THEN _                                             ' KG111101
  3541.         GOTO 9520                                                    ' KG111101
  3542.      X$ = ECHOER$
  3543.      ECHOER$ = MID$(USER.OPTIONS$,14,1)
  3544.      IF INSTR("ICR",ECHOER$) = 0 THEN _
  3545.         ECHOER$ = "R"
  3546.      IF X$ <> ECHOER$ THEN _
  3547.         GOSUB 9525
  3548.      CALL SETECHO (ECHOER$)
  3549. 9520 NUL$ = MID$(STRING$(5,0),1, - 5 * NULLS)
  3550.      CALL SETCRLF
  3551.      USE.TPUT = (UPPER.CASE OR XON.XOFF)
  3552.      PASSWORD.SAVE$ = PASSWORD$
  3553.      RETURN
  3554. 9525 IF ECHOER$ = "R" THEN _
  3555.         CALL QTPUT ("RBBS now echoing what you type",1) _
  3556.      ELSE IF ECHOER$ = "C" THEN _
  3557.              CALL QTPUT ("Please set your communications package to echo",1) _
  3558.      ELSE CALL QTPUT ("Intermediate host now echoing what you type",1)
  3559.      RETURN
  3560. '
  3561. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)
  3562. '
  3563. 9700 RETURN.ON$ = "N"
  3564.      A1$ = BULLETIN.MENU$
  3565. 9701 CALL SUBMENU ("Read what bulletin(s), L)ist, N)ew ([ENTER] = none)",_
  3566.                    A1$, BULLETIN.PREFIX$,"",RETURN.ON$,_
  3567.                    USER.GRAPHIC.DEFAULT$,FALSE,FALSE,FALSE,"")   'KG120501
  3568.      IF Q = 0 THEN _
  3569.         RETURN
  3570.      IF SUBROUTINE.PARAMETER = -1 THEN _
  3571.         RETURN 10595
  3572.      IF Z$ = "N" THEN _
  3573.         GOTO 9760
  3574.      STOP.INTERRUPTS = FALSE
  3575.      CALL BUFFILE (FILE.NAME$,ANS.INDEX)
  3576.      CALL UPDTCALR ("Read bulletin " + FILE.NAME$,1)
  3577. 9703 ANS.INDEX = ANS.INDEX + 1
  3578.      IF ANS.INDEX > LAST.INDEX THEN _
  3579.         ANS.INDEX = 0
  3580.      GOTO 9701
  3581. '
  3582. ' *  CHECK AND REVIEW NEW BULLETINS SINCE LAST LOGON
  3583. '
  3584. 9750 CALL QTPUT ("Checking for NEW bulletins...Stand by....",1)    'BK011301
  3585.      CALL CHKNEWBUL (BOARD.CHECK.DATE$,NUM.NEW.BULLETS,NEW.BULLETS$)
  3586.      CALL SKIPLINE (1)
  3587.      A$ = STR$(NUM.NEW.BULLETS) + _
  3588.           " NEW BULLETIN(S) since last call" + _
  3589.           NEW.BULLETS$
  3590.      GOSUB 12979
  3591.      RETURN
  3592. 9760 ' ****  [entry when want review plus chance to read] *********
  3593.      GOSUB 9750
  3594.      IF NUM.NEW.BULLETS > 0 THEN _
  3595.         LAST.INDEX = Q : _
  3596.         A$ = "READ ALL new bulletins ([Y],N)" : _
  3597.         GOSUB 12999 : _
  3598.         IF NOT NO THEN _
  3599.            ANS.INDEX = 2: _
  3600.            GOTO 9700
  3601.      IF ANS.INDEX < 1 THEN _
  3602.         RETURN _
  3603.      ELSE ANS.INDEX = 0 : _
  3604.           GOTO 9701
  3605. '
  3606. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)
  3607. '
  3608. 9800 CALL WHOSON (NODES.IN.SYSTEM)
  3609.     CALL ASKMORE ("",TRUE,FALSE,X,TRUE) 'Pe 02/11/89 
  3610.      GOSUB 5344
  3611.      RETURN
  3612. '
  3613. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)
  3614. '
  3615. 10070 FILE.NAME$ = COMMENTS.FILE$
  3616.       IF NOT STOP.INTERRUPTS THEN _
  3617.          A$ = "* Ctrl-K(^K) / ^X aborts. ^S suspends, ^Q resumes *" : _
  3618.          GOSUB 12976
  3619.       GOSUB 20150
  3620.       RETURN
  3621. '
  3622. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)
  3623. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)
  3624. '
  3625. 10090  A$ = "List - U)sers, R)ecent callers"
  3626.       CALL SKIPLINE (1)
  3627.       GOSUB 12998
  3628.       IF Q = 0 THEN _
  3629.          RETURN
  3630.       CALL ALLCAPS (B$(1))
  3631.       ON INSTR("UR",B$(1)) + 1 GOTO 10090,10096,10093
  3632. 10093 CALL DISPCALL
  3633.       RETURN
  3634. 10096 USER.RECORD.HOLD$ = USER.RECORD$
  3635.       GOSUB 12700
  3636.       CALL OPENUSER (HIGHEST.USER.RECORD)
  3637.       GOSUB 9450
  3638.       STOP.INTERRUPTS = FALSE
  3639.       NON.STOP = (PAGE.LENGTH < 1)
  3640.       I = 1
  3641.       Z$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  3642. 10097 IF I > HIGHEST.USER.RECORD OR RET THEN _
  3643.          GOTO 10099
  3644.       GET 5,I
  3645.       X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  3646.       IF ASC(X$)=0 OR LEFT$(X$,3)="   " OR LEFT$(PASSWORD$,3)="   " THEN _
  3647.          GOTO 10098
  3648.       IF INSTR(X$,Z$) > 0 OR SYSOP.SECURITY.LEVEL <= CVI(MID$(USER.RECORD$,47,2)) THEN _
  3649.          IF NOT SYSOP THEN _
  3650.             GOTO 10098
  3651.       CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  3652.       IF NO OR SUBROUTINE.PARAMETER = -1 THEN _
  3653.          GOTO 10099
  3654.       A$ =LEFT$(X$,36) + CITY.STATE$ + LAST.DATE.TIME.ON$           'KG102302
  3655.         GOSUB 12979                                                 'KG103002
  3656. 10098 I = I + 1
  3657.       GOTO 10097
  3658. 10099 A$ = ""
  3659.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  3660.       STOP.INTERRUPTS = TRUE
  3661.       RETURN
  3662. '
  3663. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGES)
  3664. '
  3665. 10390 A$ = "Recover Msg #"
  3666.       GOSUB 12995
  3667.       CALL CHECKINT (B$(1))
  3668.       IF EC <> 0 THEN _
  3669.          GOTO 10390
  3670.       MESSAGE.TO.RECOVER = TESTED.INTEGER.VALUE
  3671.       IF MESSAGE.TO.RECOVER < 1 THEN _
  3672.          GOTO 12980
  3673.       GOSUB 5344
  3674.       ACTION.FLAG = FALSE
  3675.       CALL RECOVMSG (MESSAGE.TO.RECOVER,FIRST.MESSAGE.RECORD,ACTION.FLAG,GRN$) 'Pe 01/12/89
  3676. 10392 IF ACTION.FLAG THEN _
  3677.          GOTO 1900
  3678.       RETURN
  3679. '
  3680. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)
  3681. '
  3682. 10530 A$ = "Delete comments (Y/[N])"
  3683.       GOSUB 12995
  3684.       IF YES THEN _
  3685.          CALL OPENOUTW (COMMENTS.FILE$)
  3686.       CLOSE 2
  3687. 10550 RETURN
  3688. '
  3689. ' *  TIME LIMIT EXCEEDED EXIT
  3690. '
  3691. 10553 CALL UPDTCALR ("Time limit exceeded",1)
  3692.       CALL QTPUT ("Sorry "+FIRST.NAME$ +" Your time limit has expired",1)
  3693.       GOTO 10562           'Pe 02/04/88
  3694. '
  3695. ' *  Q - COMMAND FROM GLOBAL FUNCTIONS
  3696. '
  3697. ' added the following for Comment at LogOff
  3698. '
  3699. 10560 IF TIME.REMAINING! < 5  THEN LOGOFF$ = "L"
  3700. '      IF EXPERT.USER THEN LOGOFF$ = "L"
  3701. '      IF YES AND CONFERENCE.MODE AND _
  3702. '         COMMENTS.AS.MESSAGES THEN LOGOFF$ = "L"
  3703.       IF LOGOFF$ = "L" THEN 10562
  3704. '
  3705. 'line 10562 is orig 10560  Pe 02/04/89
  3706. '
  3707. 10562 GOSUB 9100
  3708.       IF NOT SYSOP AND _
  3709.          USER.SECURITY.LEVEL < SECURITY.EXEMPT.FROM.EPILOG THEN _
  3710.            FILE.NAME$ = EPILOG$ : _
  3711.            GOSUB 11520
  3712.       IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  3713.          CALL UPDTCALR ("Logged off",1)
  3714.       GOTO 10595
  3715. 10570 IF TIME.REMAINING! < 2 THEN _        'Pe 02/06/89
  3716.        GOTO 10573                          'Pe 02/06/89
  3717.      CALL QTPUT ("  A)bort Logoff "+ CRLF$+ _
  3718.                  "  C)omment to Sysop then log off "+CRLF$ + _
  3719.                  "  G)o ahead Log me off (NO Comment) " + CRLF$ ,1)
  3720. A$ =  "  Enter Choice (A,C,[G]) "
  3721.         SUBROUTINE.PARAMETER = 1
  3722.         TURBO.KEY = -TURBO.KEY.USER
  3723.         CALL TGET
  3724.         CALL ALLCAPS (B$)
  3725.         X = INSTR("ACG",B$)
  3726.         IF B$ = "" THEN _
  3727.            GET.OUT = TRUE : _
  3728.            GOTO 10562
  3729.     ON X GOTO 10571,10572,10573
  3730.     GOTO 10573
  3731. 10571 RETURN
  3732. 10572 LOGOFF$ = "G"
  3733.       GET.OUT = TRUE
  3734.       GOTO 1800
  3735. 10573 GET.OUT = TRUE
  3736.       LOGOFF$ = "L"     'Pe 02/04/89
  3737.       GOTO 10560
  3738. 10590 CALL UPDTCALR ("Sleep Disconnect",1)
  3739.       SUB.BOARD = FALSE
  3740. 10595 CALL GETIME
  3741.       GOSUB 13700
  3742.       IF DOWNLOAD.COMPLETED = TRUE AND AUTO.END = 1 THEN _    'ADDED FOR 17B
  3743.       GOSUB 46000 
  3744.       SUBROUTINE.PARAMETER = 0
  3745.       CALL CARRIER
  3746.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3747.          GOTO 10597
  3748.       IF GRN$ = ORIG.MSG.NAME$ THEN _
  3749.          GET.OUT = TRUE
  3750.       IF (SUB.BOARD AND NOT GET.OUT) THEN _                          ' KG101511
  3751.          GOSUB 5380 : _                                              ' KG101511
  3752.          B$(2) = "MAIN" : _                                          ' KG101511
  3753.          Z$ = "MAIN" : _                                             ' KG101511
  3754.          Q = 2 : _                                                   ' KG101511
  3755.          FF = 8 : _                                                  ' KG101511
  3756.          CALL QTPUT ("Time limit exceeded in " + GRN$,1) : _         ' KG101511
  3757.          SUB.BOARD = FALSE : _                                       ' KG101511
  3758.          GOTO 1240                                                   ' KG101511
  3759. 10597 CALL UPDATEU (TRUE)                 'KG102202
  3760.       GOTO 13540
  3761. 10620 CALL UPDTCALR(LG$(LOGON.ERROR.INDEX),2)
  3762.       IF EXIT.TO.DOORS THEN _                                        ' KG112503
  3763.          CALL UPDATEU (TRUE)                                         ' KG112503
  3764. 10621 IF ACTIVE.USER.NAME$ = "" THEN _
  3765.          ACTIVE.USER.NAME$ = "NAME UNAVAILABLE"
  3766.       Z$ = ACTIVE.USER.NAME$ + _
  3767.            " on at " + _
  3768.            CURRENT.DATE$ + _
  3769.            ", " + _
  3770.            TIM$ + _
  3771.            "** LOGON DENIED **, " + _
  3772.            BAUD.PARITY$
  3773.       NG$ = Z$ + _
  3774.             SPACE$(128 - LEN(Z$))
  3775. 10698  A$ = "Access denied!"
  3776.       GOSUB 12976
  3777.       CALL DELAYIT (8 + BPS)
  3778.       GOTO 13545
  3779. '
  3780. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)
  3781. '
  3782. 10925 UTILITY.MARGIN.CHANGE = TRUE
  3783.       GOSUB 3100
  3784.       UTILITY.MARGIN.CHANGE = FALSE
  3785.       RETURN
  3786. '
  3787. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)
  3788. '
  3789. 10930 IF DOS.VERSION < 2 OR _
  3790.          (REQUIRED.RINGS = 0 AND NOT SHOOT.YOURSELF) THEN _
  3791.          CALL QTPUT("Remote DOS unavailable",1) : _
  3792.          RETURN
  3793. 10932 IF LOCAL.USER AND NOT DEBUG THEN _
  3794.          CALL QTPUT("Only for remote SYSOP's",1) : _
  3795.          RETURN
  3796.       CALL DOSEXIT
  3797.       SUBROUTINE.PARAMETER = -9
  3798.       CALL FINDFUNC
  3799.       GOTO 202
  3800. '
  3801. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)                               *
  3802. '
  3803. 10970 IF NOT DOORS.AVAILABLE OR _
  3804.          (REQUIRED.RINGS = 0 AND NOT SHOOT.YOURSELF) THEN _
  3805.          CALL QTPUT("All doors locked!",1) : _
  3806.          RETURN
  3807.       IF TIME.LOCK AND 1 AND NOT.HAS.DOORED THEN _             'KG101201
  3808.          CALL TIMELOCK : _
  3809.          IF NOT OK THEN _
  3810.             RETURN
  3811. 10974 A1$ = MENU$(5)
  3812.       CALL SUBMENU ("Open which door, L)ist" + PRESS.ENTER.EXPERT$, _
  3813.                     A1$,"",".BAT","",_
  3814.                     USER.GRAPHIC.DEFAULT$,TRUE,FALSE,TRUE,"")   'KG120501
  3815.       IF Q = 0 THEN _
  3816.          RETURN
  3817.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3818.          RETURN 10595
  3819. 10986 Z$ = FILE.NAME$
  3820.       CALL DOOREXIT
  3821. '
  3822. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)                      *
  3823. '
  3824. 11000 TU = USER.FILE.INDEX
  3825.       USER.RECORD.HOLD$ = USER.RECORD$
  3826.       REG.DATE.HOLD$ = REG.DATE$
  3827. 11001 STOP.INTERRUPTS = TRUE                 'KG102201
  3828.       I = 1
  3829.       SCAN.USERS = FALSE
  3830.       TURBO.KEY = -TURBO.KEY.USER
  3831.       A$ = "A)dd, L)st, P)rt, M)od, S)can users"
  3832.       GOSUB 12998
  3833. 11003 IF Q = 0 THEN _
  3834.          GOTO 20093
  3835.       QQ = 0
  3836.       Z$ = LEFT$(B$(1),1)
  3837.       CALL ALLCAPS (Z$)
  3838.       IF Z$ = "A" THEN _
  3839.          GOTO 12300 _
  3840.       ELSE IF Z$ = "M" THEN _
  3841.               STOP.INTERRUPTS = TRUE _
  3842.            ELSE IF Z$ = "P" THEN _
  3843.                    QQ = TRUE _
  3844.                 ELSE IF Z$ = "S" THEN _
  3845.                         SCAN.USERS = TRUE : _
  3846.                         STOP.INTERRUPTS = TRUE _
  3847.                      ELSE IF Z$ <> "L" THEN _
  3848.                              GOTO 11001                'KG102701
  3849. 11005 CALL OPENUSER (HIGHEST.USER.RECORD)
  3850.       GOSUB 9450
  3851.       Z = 1
  3852.       IF SCAN.USERS THEN _
  3853.               A$ = "Scan for N)ame, P)wd, C)ity/St, L)evel" + _           ' KG110302
  3854.               LEFT$(", H)ash id",-9*(START.HASH > 1 AND LEN.HASH > 0)) : _ ' KG110302
  3855.          GOSUB 12999 : _
  3856.          A$ = "" : _
  3857.          SCAN.FUNCTION$ = LEFT$(B$(1),1) : _
  3858.          CALL ALLCAPS (SCAN.FUNCTION$) : _
  3859.          CR = 0 : _
  3860.          GOSUB 12979 : _
  3861.          GOSUB 12966 : _
  3862.          GOTO 12962
  3863. 11010 FOR J = Z TO HIGHEST.USER.RECORD
  3864.          GET 5,J
  3865. 11015    X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  3866.          IF ASC(X$) = 0 OR LEFT$(X$,3) = "   " THEN _
  3867.             GOTO 11310
  3868.          OF = CVI(SECURITY.LEVEL$)
  3869.          IF OF > USER.SECURITY.LEVEL THEN _                          ' KG103101
  3870.             IF NOT GLOBAL.SYSOP THEN _                               ' KG103101
  3871.                GOTO 11310                                            ' KG103101
  3872.          A$ = FG.4$ + RIGHT$("     " + STR$(LOC(5)),4) + _
  3873.               ":" + _
  3874.               FG.1$ + USER.NAME$ + _
  3875.               FG.2$ + "SECURITY" + _
  3876.               RIGHT$("     " + STR$(OF),5) + _
  3877.               " "
  3878. 11020    A$ = A$ + _
  3879.               FG.3$ + "Password = " + _
  3880.               PASSWORD$ + EMPHASIZE.OFF$
  3881. 11025    IF QQ THEN _
  3882.             CALL PRINTIT (A$)
  3883. 11027    GOSUB 12979
  3884.          IF RET <> 0 THEN _
  3885.             GOTO 11330
  3886.          IF OF < ORIG.MIN.SEC THEN _                                 ' KG011801
  3887.            A$ = EMPHASIZE.ON$ + "<Locked out>" + EMPHASIZE.OFF$ + SPACE$(7) : _
  3888.             GOTO 11030
  3889.          IF OF >= SYSOP.SECURITY.LEVEL THEN _
  3890.             A$ = EMPHASIZE.ON$ + "  (SYSOP)  " + EMPHASIZE.OFF$ + SPACE$(8) : _
  3891.             GOTO 11030
  3892.          A$ = SPACE$(19)
  3893. 11030    A$ = A$ + _
  3894.               LAST.DATE.TIME.ON$ + _
  3895.              "   " + _
  3896.              FG.4$ + CITY.STATE$ + EMPHASIZE.OFF$
  3897. 11100    IF QQ THEN _
  3898.             CALL PRINTIT (A$)
  3899. 11101    CALL QTPUT(A$,1)
  3900.         IF RET <> 0 THEN _
  3901.            GOTO 11330
  3902.         A$ = "  DOWNLOADS = " + _
  3903.              RIGHT$("     " + STR$(CVI(USER.DOWNLOADS$)),5) + _
  3904.              "   " + _
  3905.              "UPLOADS = " + _
  3906.              RIGHT$("     " + STR$(CVI(USER.UPLOADS$)),5) + _
  3907.              "   " + _
  3908.              " Times on ="
  3909.          A$ = A$ + RIGHT$("     " + STR$(CVI(MID$(USER.OPTIONS$,1,2))),5) + _
  3910.              "   " + _
  3911.              "TIME USED = " + _
  3912.              RIGHT$("    " + STR$(CVI(ELAPSED.TIME$)),4) + _
  3913.              " Min"
  3914.         IF QQ THEN _
  3915.            CALL PRINTIT (A$)
  3916. 11105   CALL QTPUT (A$,1)
  3917.         IF RET <> 0 THEN _
  3918.            GOTO 11330
  3919. '         IF NOT ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
  3920. '            GOTO 11106
  3921.          A$ = "BYTES: Dwn=" + STR$(CVS(DL.BYTES$)) + _
  3922.               "  Up=" + STR$(CVS(UL.BYTES$)) + _
  3923.               " TODAY Dwn: #=" + STR$(CVS(TODAY.DL$)) + _
  3924.               " Bytes=" + STR$(CVS(TODAY.BYTES$))
  3925.          IF QQ THEN _
  3926.             CALL PRINTIT (A$)
  3927.          CALL QTPUT (A$,1)
  3928.          IF RET <> 0 THEN _
  3929.             GOTO 11330
  3930. 11106   IF (START.INDIV = 0 OR LEN.INDIV = 0) AND _                  ' KG103004
  3931.            (START.HASH = 0 OR LEN.HASH = 0) AND _                    ' KG110301
  3932.            NOT RESTRICT.BY.DATE THEN _                               ' KG103004
  3933.               GOTO 11107                                             ' KG103004
  3934.         IF (START.HASH > 1 AND LEN.HASH > 0) THEN _                  ' KG110301
  3935.            A$ = "Hash: " + MID$(USER.RECORD$,START.HASH,LEN.HASH) _  ' KG110301
  3936.         ELSE A$ = ""                                                 ' KG110301
  3937.         IF (START.INDIV > 1 AND LEN.INDIV > 0) THEN _                ' KG110301
  3938.      A$ = A$ + " Indiv: " + MID$(USER.RECORD$,START.INDIV,LEN.INDIV) ' KG110301
  3939.         IF RESTRICT.BY.DATE THEN _                                   ' KG103004
  3940.             GOSUB 11480 : _                                          ' KG103004
  3941.             A$ = A$ + "  Registration date = " + _                   ' KG103004
  3942.                  REG.DISPLAY.DATE$                                   ' KG103004
  3943.             CALL QTPUT (A$,1)                                    ' KG103004
  3944.             IF QQ THEN _                                             ' KG103004
  3945.                CALL PRINTIT (A$)                                     ' KG103004
  3946.         IF RET <> 0 THEN _
  3947.            GOTO 11330
  3948. 11107   IF NOT STOP.INTERRUPTS THEN _
  3949.            GOTO 11310
  3950. 11110 A$ ="D)elete,  F)ind,  M)enu,  N)ew pwd,  P)rint,  R)eset graphics"+CRLF$
  3951.   A$ = A$ +"Q)uit,  S)ecurity, U)ploads/downloads,  #)user , T)ime used"
  3952.         IF RESTRICT.BY.DATE THEN _
  3953.            A$ = A$ + _
  3954.                 ",$)RegDate"
  3955.         GOSUB 12999
  3956.         IF NOT SCAN.USERS AND Q = 0 THEN _
  3957.            GOTO 11310
  3958. 11115   Z$ = LEFT$(B$(1),1)
  3959.         CALL ALLCAPS (Z$)
  3960.         X = INSTR("DNPQFSMRU$T#",Z$)
  3961.         IF Z$ = "" AND SCAN.USERS THEN _
  3962.            GOTO 12965
  3963.     ON X GOTO 11130,11160,11220,11320,11340,11390,11330,11400,11410,11450,11420,11127
  3964. 11125   Z = VAL(B$)
  3965.         IF Z < 1 OR Z > HIGHEST.USER.RECORD THEN _       'Pe 11/10/88 was 11310
  3966.            GOTO 11127
  3967.         GOTO 11010
  3968. 11127   A$ = "What record #"
  3969.         GOSUB 12995
  3970.         GOTO 11125
  3971. '
  3972. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)               *
  3973. '
  3974. 11130   A$ = "Delete user (Y/[N])"
  3975.         GOSUB 12995
  3976.         IF YES THEN _
  3977.            LSET USER.NAME$ = CHR$(0) + _
  3978.                              "deleted user" : _
  3979.            LSET SECURITY.LEVEL$ = MKI$(MINIMUM.LOGON.SECURITY - 1) : _
  3980.            LSET LAST.DATE.TIME.ON$ = "01-01-80" + _
  3981.                                      " " + _
  3982.                                      TIME.LOGGED.ON$
  3983.         GOTO 11290
  3984. '
  3985. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)      *
  3986. '
  3987. 11160   GOSUB 12800
  3988.         GOTO 11290
  3989. '
  3990. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)           *
  3991. '
  3992. 11220   QQ = NOT QQ
  3993.         GOTO 11015
  3994. 11290   USER.FILE.INDEX = LOC(5)
  3995.         GOSUB 12989
  3996.         GOSUB 9440
  3997.         GOSUB 12991
  3998.         USER.FILE.INDEX = 0
  3999.         GOTO 11015
  4000. 11310   IF SCAN.USERS THEN _
  4001.            GOTO 12965
  4002. 11311 NEXT
  4003. '
  4004. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)         *
  4005. '
  4006. 11320 USER.FILE.INDEX = TU
  4007.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  4008.       REG.DATE$ = REG.DATE.HOLD$
  4009.       RETURN 1200
  4010. '
  4011. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)     *
  4012. '
  4013. 11330 CLOSE 2
  4014.       GOTO 11001                      'KG102701
  4015. '
  4016. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)                 *
  4017. '
  4018. 11340 A$ = PROMPT.HASH$ + _
  4019.            " to find"
  4020.       CALL SKIPLINE (1)
  4021.       GOSUB 12995
  4022.       IF Q = 0 THEN _
  4023.          GOTO 11340
  4024.       TEMP.HASH.VALUE$ = B$
  4025.       IF LEN(TEMP.HASH.VALUE$) < 3 OR LEN(TEMP.HASH.VALUE$) > LEN.HASH THEN _
  4026.          GOTO 11340
  4027.       CALL ALLCAPS (TEMP.HASH.VALUE$)
  4028.       IF START.INDIV < 1 THEN _
  4029.          GOTO 11345
  4030. 11342 A$ = PROMPT.INDIV$ + _
  4031.            " to find"
  4032.       GOSUB 12995
  4033.       IF Q = 0 THEN _
  4034.          GOTO 11342
  4035.       TEMP.INDIV.VALUE$ = B$
  4036.       IF LEN(TEMP.INDIV.VALUE$) > LEN.INDIV THEN _                   ' KG103004
  4037.          GOTO 11342
  4038.       CALL ALLCAPS (TEMP.INDIV.VALUE$)
  4039. 11345 GOSUB 12600
  4040.       GOSUB 12984
  4041.       USER.FILE.INDEX = 0
  4042.       IF FOUND THEN _
  4043.          GOTO 11015
  4044. 11380 A$ = TEMP.HASH.VALUE$ + _
  4045.            " " + _
  4046.            TEMP.INDIV.VALUE$ + _
  4047.            " not found"
  4048.       GOSUB 12977
  4049.       GOTO 11310
  4050. '
  4051. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)      *
  4052. '
  4053. 11390 GOSUB 11395
  4054.       LSET SECURITY.LEVEL$ = MKI$(OF)
  4055.       GOTO 11290
  4056. 11395 A$ = "New sec level"
  4057.       GOSUB 12995
  4058.       CALL ALLCAPS (B$(1))
  4059.       Z$ = B$(1)
  4060.       OF = VAL(Z$)
  4061.       IF OF > USER.SECURITY.LEVEL THEN _
  4062.          OF = USER.SECURITY.LEVEL
  4063.       RETURN
  4064. '
  4065. ' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)       *
  4066. '
  4067. 11400 A = CVI(MID$(USER.OPTIONS$,9,2))                               ' JM111002
  4068.       A = A AND &HFAFF                ' TURN HIGHLIGHTING OFF        ' JM111002
  4069.       LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,5) + _                ' JM111002
  4070.                            "0" + _                                   ' JM111002
  4071.                            MID$(USER.OPTIONS$,7,2) + _               ' JM111002
  4072.                            MKI$(A) + _                               ' JM111002
  4073.                            MID$(USER.OPTIONS$,11)                    ' JM111102
  4074.       GOTO 11290
  4075. '
  4076. '*************************************************************
  4077. '* U - COMMAND FROM 5 CHANGE UPLOADS AND DOWNLOADS           *
  4078. '*************************************************************
  4079. '
  4080. 11410 A$ = "Enter NEW value for ToTal Uploads, press (ENTER) for no change"
  4081.       GOSUB 12995
  4082.       IF Q = 0 THEN _
  4083.       GOTO 11411
  4084.       LSET USER.UPLOADS$ = MKI$(VAL(B$(1)))
  4085. 11411 A$ = "Enter NEW # of Upload bytes, press (ENTER) for no change"
  4086.       GOSUB 12995
  4087.       IF Q = 0 THEN _
  4088.       GOTO 11412
  4089.       LSET UL.BYTES$ = MKS$(VAL(B$(1)))
  4090. 11412 A$ = "Enter NEW value for TOTAL downloads, press (ENTER) for no change"
  4091.       GOSUB 12995
  4092.       IF Q = 0 THEN _
  4093.       GOTO 11413
  4094.       LSET USER.DOWNLOADS$ = MKI$(VAL(B$(1)))
  4095. 11413 A$ = "Enter NEW value for DOWNLOADS TODAY, press (ENTER) for no change"
  4096.       GOSUB 12995
  4097.       IF Q = 0 THEN _
  4098.       GOTO 11414
  4099.       LSET TODAY.DL$ = MKS$(VAL(B$(1)))
  4100. 11414 A$ = "Enter NEW value for TODAYS BYTES, press (ENTER) for no change"
  4101.       GOSUB 12995
  4102.       IF Q = 0 THEN _
  4103.       GOTO 11415
  4104.       LSET TODAY.BYTES$ = MKS$(VAL(B$(1)))
  4105. 11415 A$ = "Enter NEW # of TOTAL Download bytes, press (ENTER) for no change"
  4106.       GOSUB 12995
  4107.       IF Q = 0 THEN _
  4108.       GOTO 11290
  4109.       LSET DL.BYTES$ = MKS$(VAL(B$(1)))
  4110.       GOTO 11290
  4111. '
  4112. '*****************************************************************
  4113. '* T - COMMAND FROM 5---CHANGE TIME LEFT                         *
  4114. '*****************************************************************
  4115. 11420  A$ = crlf$ + "Enter new value for Time used, press (ENTER) for no change"
  4116.       GOSUB 12995
  4117.       IF Q = 0 THEN _
  4118.       GOTO 11290
  4119.       LSET ELAPSED.TIME$ = MKI$(VAL(B$(1)))
  4120.       GOTO 11290
  4121. '
  4122. ' *****************************************************************************
  4123. '
  4124. ' *  $ - COMMAND FROM 5 - USER MAINTENANCE (CHANGE REGISTRATION DATE)         *
  4125. '
  4126. 11450 A$ = "Enter new registration date (MM-DD-YY)"
  4127.       GOSUB 12995
  4128.       IF Q = 0 THEN _
  4129.          GOTO 11015
  4130. 11455 WORK.DATE$ = B$(1)
  4131.       IF LEN(WORK.DATE$) < 8 THEN _
  4132.          GOTO 11450
  4133.       GOSUB 11470
  4134.       IF NOT OK THEN _
  4135.          GOTO 11450
  4136.       LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,10) + _
  4137.                            REG.DATE$ + _
  4138.                            MID$(USER.OPTIONS$,13)
  4139.       GOSUB 11480
  4140.       REG.DATE$ = REG.DATE.HOLD$
  4141.       GOTO 11290
  4142. '
  4143. ' *  CALCULATE REGISTRATION DATES                                             *
  4144. '
  4145. 11470 IF LEN(WORK.DATE$) < 10 THEN _
  4146.          WORK.DATE$ = LEFT$(WORK.DATE$,6) + _
  4147.                       "19" + _
  4148.                       RIGHT$(WORK.DATE$,2)
  4149.       TODAY.REG.YY = VAL(MID$(WORK.DATE$,7))
  4150.       TODAY.REG.MM = VAL(LEFT$(WORK.DATE$,2))
  4151.       TODAY.REG.DD = VAL(MID$(WORK.DATE$,4,2))
  4152.       OK = TODAY.REG.YY > 1979 AND TODAY.REG.MM > 0 AND _
  4153.            TODAY.REG.MM < 13 AND TODAY.REG.DD > 0 AND _
  4154.            TODAY.REG.DD < 32
  4155.       IF OK THEN _
  4156.          CALL TWOBYTEDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,REG.DATE$)
  4157.       RETURN
  4158. 11480 X$ = MID$(USER.OPTIONS$,11,2)
  4159.       IF CVI(X$) <> 0 THEN _
  4160.          REG.DATE$ = X$ : _
  4161.       ELSE GOSUB 11482
  4162.       CALL UNCDATE (REG.DATE$,USER.REG.YY,USER.REG.MM,USER.REG.DD,REG.DISPLAY.DATE$)
  4163.       IF CVI(X$) = 0 THEN _
  4164.          REG.DISPLAY.DATE$ = "00-00-00"
  4165.       RETURN
  4166. 11482 WORK.DATE$ = DATE$
  4167.       GOTO 11470
  4168. '
  4169. ' *  ALLOW USERS TO ANSWER A "QUESTIONNAIRE" BASED ON THE RBBS-PC SCRIPT      *
  4170. '
  4171. 11520 QUESTIONNAIRE.ABORTED = FALSE
  4172.       QUESTIONNAIRE.CHAIN.STARTED = FALSE
  4173.       CALL FINDIT (FILE.NAME$)
  4174.       IF NOT OK THEN _
  4175.          RETURN
  4176.       REDIM A$(256)
  4177.       CALL ASKUSERS
  4178.       IF ADJUSTED.SECURITY THEN _
  4179.          GOSUB 12989 : _
  4180.          LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  4181.          GOSUB 9440 : _
  4182.          GOSUB 12991 : _
  4183.          CALL CALLOPT : _
  4184.          CALL XFERTYPE (2,TRUE) : _
  4185.          GOSUB 5135
  4186.       REDIM A$(ADIM)
  4187.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4188.          RETURN 10595
  4189.       OK = TRUE
  4190.       RETURN
  4191. '
  4192. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)                  *
  4193. '
  4194. 12300 A1$ = ""
  4195.       ATTEMPTS = 0
  4196.       USER.SECURITY.LEVEL.SAVE = USER.SECURITY.LEVEL
  4197.       FIRST.NAME.SAVE$ = FIRST.NAME$
  4198.       LAST.NAME.SAVE$ = LAST.NAME$
  4199.       ACTIVE.USER.NAME.SAVE$ = ACTIVE.USER.NAME$
  4200.       CITY.STATE.SAVE$ = CI$
  4201.       HASH.VALUE.SAVE$ = HASH.VALUE$
  4202.       INDIV.VALUE.SAVE$ = INDIV.VALUE$
  4203.       GOSUB 12500
  4204.       GOSUB 12840
  4205.       GOSUB 12850
  4206.       GOSUB 12598
  4207.       IF USER.FILE.INDEX = 0 THEN _
  4208.          GOSUB 12984 : _
  4209.          GOTO 12330
  4210.       IF FOUND THEN _
  4211.          D$ = "User already exists" : _
  4212.          GOSUB 1315 : _
  4213.          GOSUB 12984 : _
  4214.          GOTO 12330
  4215. 12310 GOSUB 12630
  4216.       GOSUB 12800
  4217.       GOSUB 11395
  4218.       TEMP.SECURITY.LEVEL = OF
  4219.       GOSUB 12900
  4220.       LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  4221.                                 " " + _
  4222.                                 TIME.LOGGED.ON$
  4223.       GOSUB 12960
  4224.       CALL ALLCAPS (B$)
  4225.       LSET CITY.STATE$ = B$
  4226.       LSET ELAPSED.TIME$ = MKI$(0)
  4227.       IF START.HASH > 1 THEN _
  4228.          MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  4229.       IF START.INDIV > 1 THEN _
  4230.          MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  4231.       GOSUB 9440
  4232. 12320 GOSUB 12991
  4233. 12330 USER.SECURITY.LEVEL = USER.SECURITY.LEVEL.SAVE
  4234.       FIRST.NAME$ = FIRST.NAME.SAVE$
  4235.       LAST.NAME$ = LAST.NAME.SAVE$
  4236.       ACTIVE.USER.NAME$ = ACTIVE.USER.NAME.SAVE$
  4237.       CI$ = CITY.STATE.SAVE$
  4238.       HASH.VALUE$ = HASH.VALUE.SAVE$
  4239.       INDIV.VALUE$ = INDIV.VALUE.SAVE$
  4240.       USER.FILE.INDEX = TU
  4241.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  4242.       GOTO 11001                                 'KG10270
  4243. '
  4244. ' *  GET USER FIRST AND LAST NAMES                                            *
  4245. '
  4246. 12500 IF ATTEMPTS > 5 THEN _
  4247.          FF = TRUE : _
  4248.          RETURN
  4249. 12510 GOSUB 12700
  4250.       ATTEMPTS = ATTEMPTS + 1
  4251.       A$ = A1$ + _
  4252.            FIRST.NAME.PROMPT$
  4253.       CALL SKIPLINE (1)
  4254.       LOGON.ACTIVE = TRUE
  4255.       GOSUB 12555
  4256.       LOGON.ACTIVE = FALSE
  4257.       CALL TRIM (Z$)
  4258.       FIRST.NAME$ = Z$
  4259.       IF Q <> 1 THEN _
  4260.          I = 2: _
  4261.          GOSUB 12556 : _
  4262.          GOTO 12540
  4263. 12530 A$ = A1$ + _
  4264.            LAST.NAME.PROMPT$
  4265.       GOSUB 12555
  4266.       IF Q > 0 AND INSTR(B$,";") = 0 THEN _
  4267.          Z$ = B$ _
  4268.       ELSE Z$ = B$(1)
  4269.       CALL ALLCAPS (Z$)
  4270. 12540 CALL TRIM (Z$)
  4271.       LAST.NAME$ = Z$
  4272.       IF LEN(LAST.NAME$) < 2 THEN _
  4273.          IF LEN(FIRST.NAME$) > 2 THEN _
  4274.             GOTO 12500
  4275.       IF (LEN(FIRST.NAME$) + LEN(LAST.NAME$)) > 30 THEN _
  4276.          GOTO 12500
  4277.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  4278.          IF (LEN(FIRST.NAME$) < 2 OR LEN(LAST.NAME$) < 2) THEN _
  4279.             GOTO 12500 _
  4280.          ELSE IF LEFT$(FIRST.NAME$,1)=" " OR LEFT$(LAST.NAME$,1)=" " THEN _
  4281.                  GOTO 12500
  4282. 12550 ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + " " + LAST.NAME$,1,31)
  4283.       IF HASH.INDIV > 1 THEN _
  4284.          IF Q < 3 THEN _
  4285.             GOSUB 12558 : _
  4286.             IF NO THEN _
  4287.                GOTO 12500
  4288.       Z$ = FIRST.NAME$
  4289.       RETURN
  4290. '
  4291. ' *  CHECK FOR NAMES NOT ALLOWED                                              *
  4292. '
  4293. 12555 GOSUB 12995
  4294.       IF Q = 0 THEN _
  4295.          RETURN 12500
  4296.       I = 1
  4297. 12556 Z$ = B$(I)
  4298. 12557 CALL ALLCAPS (Z$)
  4299.       CALL REMNONALF (Z$,31,91)
  4300.       RETURN
  4301. 12558 A$ = "Are you '" + _
  4302.            ACTIVE.USER.NAME$ + _
  4303.            "' ([Y],N)"
  4304.       GOSUB 12995
  4305.       RETURN
  4306. 12570 FOUND = FALSE
  4307.       CALL OPENWORK (TRASHCAN.FILE$)
  4308.       IF EC = 53 THEN _
  4309.          GOTO 710
  4310. 12580 IF EOF(2) THEN _
  4311.          RETURN
  4312.       INPUT #2,INVALID.NAME$
  4313.       IF Z$ <> INVALID.NAME$ THEN _
  4314.          GOTO 12580
  4315.       FOUND = TRUE
  4316.       RETURN
  4317. 12595 CALL QTPUT ("Name not valid here. Call recorded",1)
  4318.       CALL UPDTCALR ("Name violation: "+ACTIVE.USER.NAME$,1)
  4319.       GOTO 10621
  4320. '
  4321. ' *  COMMON SEARCH USER FILE ROUTINE                                          *
  4322. '
  4323. 12598 TEMP.HASH.VALUE$ = HASH.VALUE$
  4324.       TEMP.INDIV.VALUE$ = INDIV.VALUE$
  4325. 12600 GOSUB 4910
  4326.       GOSUB 12988
  4327.       IF IN.CONF.MENU THEN _
  4328.          IF NOT PRIVATE.DOOR THEN _
  4329.             CALL QTPUT ("Checking Users...",1)
  4330. 12605 CALL OPENUSER (HIGHEST.USER.RECORD)
  4331.       GOSUB 9450
  4332.       CALL FINDUSER (TEMP.HASH.VALUE$,TEMP.INDIV.VALUE$,START.HASH,LEN.HASH,_
  4333.                      START.INDIV,LEN.INDIV,HIGHEST.USER.RECORD,FOUND,_
  4334.                      USER.FILE.INDEX,SL)
  4335.      IF FOUND THEN _
  4336.         RETURN
  4337.      IF CURRENT.USER.COUNT < (HIGHEST.USER.RECORD-1)*.95 THEN _
  4338.         RETURN
  4339.      A$ = "No room for new users in " + GRN$
  4340.      CALL UPDTCALR (A$,2)
  4341.      IF ACTIVE.USER.FILE$ <> MAIN.USER.FILE$ THEN _
  4342.         USER.FILE.INDEX = 0 : _
  4343.         RETURN
  4344.       IF REMEMBER.NEW.USERS AND NOT SURVIVE.NOUSER.ROOM THEN _
  4345.          GOSUB 1397
  4346.       USER.FILE.INDEX = 0
  4347.       IF SURVIVE.NOUSER.ROOM THEN _
  4348.          REMEMBER.NEW.USERS = FALSE
  4349.       RETURN
  4350. '
  4351. ' *  AUGMENT USER COUNT, LOCK 4 REC BLOCK IN USER, UNLOCK FILES        *
  4352. '
  4353. 12630 GOSUB 23000
  4354.       CURRENT.USER.COUNT = CURRENT.USER.COUNT + (SL = 0) * REMEMBER.NEW.USERS
  4355. 12632 GOSUB 24000
  4356.       GOSUB 12985
  4357.       IF REMEMBER.NEW.USERS THEN _
  4358.          GOSUB 12989
  4359.       GOSUB 12990
  4360.       RETURN
  4361. '
  4362. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING                   *
  4363. '
  4364. 12700 IF CONFERENCE.MODE THEN _
  4365.          A$ = "Users of " + _
  4366.               GRN$ + _
  4367.               ":" : _
  4368.          GOSUB 12979
  4369.       RETURN
  4370. '
  4371. ' *  GET PASSWORD FROM NEWUSER                                                *
  4372. '
  4373. 12800 CALL NEWPASWRD ("Enter PASSWORD you'll use to logon again",FALSE) ' KG101501
  4374.       IF SUBROUTINE.PARAMETER < 0 THEN _                             ' KG101501
  4375.          GOTO 202                                                    ' KG101501
  4376.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  4377.          IF B$ = SPACE$(LEN(B$)) THEN _
  4378.             GOTO 12800                                               ' KG101501
  4379.       LSET PASSWORD$ = Z$
  4380.       RETURN
  4381. '
  4382. ' *  GET HASH VALUE FOR CURRENT USER TO LOOK UP IN THE USER'S FILE            *
  4383. '
  4384. 12840 IF START.HASH = 1 THEN _
  4385.          HASH.VALUE$ = ACTIVE.USER.NAME$ : _
  4386.          RETURN
  4387.       X$ = A1$ + _
  4388.            PROMPT.HASH$
  4389.       CALL UNTILRIGHT (X$,HASH.VALUE$,2,LEN.HASH)
  4390.       RETURN
  4391. '
  4392. ' *  GET FIELD TO INDIVIDUATE ONE USER FROM ANOTHER (NAME FIELD IS DEFAULT)   *
  4393. '
  4394. 12850 IF START.INDIV < 1 THEN _
  4395.          RETURN
  4396.       IF START.INDIV = 1 THEN _
  4397.          INDIV.VALUE$ = ACTIVE.USER.NAME$ : _
  4398.          RETURN
  4399.       X$ = A1$ + _
  4400.            PROMPT.INDIV$
  4401.       CALL UNTILRIGHT (X$,INDIV.VALUE$,2,LEN.INDIV)
  4402.       RETURN
  4403. '
  4404. ' *  SET NEWUSER DEFAULTS                                                     *
  4405. '
  4406. 12900 LSET USER.NAME$ = ACTIVE.USER.NAME$
  4407.       LSET USER.OPTIONS$ = MKI$(0) + _
  4408.                            MKI$(0) + _
  4409.                            " 0" + _
  4410.                            MKI$(64) + _
  4411.                            MKI$(16) + _
  4412.                            MKI$(0) + _
  4413.                            CHR$(23) + _
  4414.                            DEFAULT.ECHOER$
  4415.       LSET USER.DOWNLOADS$ = MKI$(0)
  4416.       LSET USER.UPLOADS$ = MKI$(0)
  4417.          LSET TODAY.DL$ = MKS$(0) 
  4418.          LSET TODAY.BYTES$ = MKS$(0) 
  4419.          LSET DL.BYTES$ = MKS$(0)
  4420.          LSET UL.BYTES$ = MKS$(0)
  4421.       LSET SECURITY.LEVEL$ = MKI$(TEMP.SECURITY.LEVEL)
  4422.       LSET ELAPSED.TIME$ = MKI$(0)
  4423.       RETURN
  4424. '
  4425. ' *  GET CITY AND STATE FROM NEWUSER                                          *
  4426. '
  4427. 12960 A$ = A1$ + _
  4428.            USER.LOCATION$
  4429.       GOSUB 12995
  4430.       IF Q = 0 THEN _
  4431.          GOTO 12960
  4432.       IF B$ = SPACE$(LEN(B$)) THEN _
  4433.          GOTO 12960
  4434.       CALL ALLCAPS (B$)
  4435.       LSET CITY.STATE$ = B$
  4436.       CI$ = B$
  4437.       RETURN
  4438. '
  4439. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)               *
  4440. '
  4441. 12962 X = 0
  4442.       FF = FALSE
  4443.       A$ = "String to search"
  4444.       GOSUB 12998
  4445.       IF Q = 0 THEN _
  4446.          GOTO 11001                 'KG102701
  4447.       CALL ALLCAPS (B$)
  4448.       WK$ = B$
  4449.       IF SCAN.FUNCTION$ = "L" THEN _
  4450.          WK$ = "," + _
  4451.                STR$(VAL(WK$)) + _
  4452.                ","
  4453. 12963 GET 5,I
  4454.       GOSUB 12966
  4455.       X = INSTR(SCAN.FIELD$,WK$)
  4456.       IF X > 0 THEN _
  4457.          GOTO 11015
  4458. 12965 I = I + 1
  4459.       IF I > HIGHEST.USER.RECORD THEN _                    'PE11/10/88
  4460.          LSET USER.RECORD$ = USER.RECORD.HOLD$ : _                   ' KG122503
  4461.          GOTO 11001                                                  ' KG102201
  4462.       X = 0
  4463.       GOTO 12963
  4464. 12966 FF = INSTR("NCPLH",SCAN.FUNCTION$)       'KG110302
  4465. 12967 ON FF GOTO 12968,12969,12970,12972,12971             'KG110302
  4466.       GOTO 11001                               'KG102201
  4467. '
  4468. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)    *
  4469. '
  4470. 12968 SCAN.FIELD$ = USER.NAME$
  4471.       RETURN
  4472. '
  4473. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST) *
  4474. '
  4475. 12969 SCAN.FIELD$ = CITY.STATE$
  4476.       RETURN
  4477. '
  4478. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)*
  4479. '
  4480. 12970 SCAN.FIELD$ = PASSWORD$
  4481.       RETURN
  4482. '
  4483. '* ------[ first line different ]------
  4484. ' *  H - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR HASH ID) ' KG110302   *
  4485. '
  4486. 12971 IF START.HASH > 0 AND LEN.HASH > 0 THEN _                      ' KG110302
  4487.          SCAN.FIELD$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)        ' KG110302
  4488.       RETURN                                                         ' KG110302
  4489. '
  4490. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)   *
  4491. '
  4492. 12972 SCAN.FIELD$ = "," + _
  4493.                     STR$(CVI(SECURITY.LEVEL$)) + _
  4494.                     ","
  4495.       RETURN
  4496. '
  4497. ' * CALLS INTO SEPARATELY COMPILED SUBROUTINES (RBBS-SUB)                     *
  4498. '
  4499. '
  4500. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE               *
  4501. '
  4502. 12975 SUBROUTINE.PARAMETER = 1
  4503.       GOTO 12981
  4504. 12976 SUBROUTINE.PARAMETER = 2
  4505.       GOTO 12981
  4506. 12977 SUBROUTINE.PARAMETER = 3
  4507.       GOTO 12981
  4508. 12978 SUBROUTINE.PARAMETER = 4
  4509.       GOTO 12981
  4510. 12979 SUBROUTINE.PARAMETER = 5
  4511.       GOTO 12981
  4512. 12980 SUBROUTINE.PARAMETER = 6
  4513. 12981 CALL TPUT
  4514. 12983 IF SUBROUTINE.PARAMETER < 0 THEN _
  4515.          GOTO 202
  4516.       IF SUBROUTINE.PARAMETER = 8 THEN _
  4517.          GOSUB 12995
  4518.       RETURN
  4519. '
  4520. ' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S *
  4521. '
  4522. 12984 SUBROUTINE.PARAMETER = 1  ' LOCK USERS & MESSAGES
  4523.       GOTO 12994
  4524. 12985 SUBROUTINE.PARAMETER = 2  ' UNLOCK MESSAGES AND FLUSH
  4525.       FLUSHED = TRUE
  4526.       GOTO 12994
  4527. 12986 SUBROUTINE.PARAMETER = 3  ' LOCK MESSAGES
  4528.       GOTO 12994
  4529. 12987 SUBROUTINE.PARAMETER = 4  ' UNLOCK MESSAGES
  4530.       GOTO 12994
  4531. 12988 SUBROUTINE.PARAMETER = 5  ' LOCK USERS
  4532.       GOTO 12994
  4533. 12989 SUBROUTINE.PARAMETER = 6  ' LOCK USER BLOCK
  4534.       GOTO 12994
  4535. 12990 SUBROUTINE.PARAMETER = 7  ' UNLOCK USERS
  4536.       GOTO 12994
  4537. 12991 SUBROUTINE.PARAMETER = 8  ' UNLOCK USER BLOCK
  4538.       GOTO 12994
  4539. 12992 SUBROUTINE.PARAMETER = 9  ' LOCK COMMENTS/UPLOAD DIR
  4540.       GOTO 12994
  4541. 12993 SUBROUTINE.PARAMETER = 10 ' UNLOCK COMMENTS/UPLOAD DIR
  4542. 12994 CALL FILELOCK
  4543.       IF FLUSHED THEN _
  4544.          FIELD 1,128 AS MESSAGE.RECORD$ : _
  4545.          FLUSHED = FALSE
  4546.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4547.          SUBROUTINE.PARAMETER = -9 : _
  4548.          CALL FINDFUNC : _
  4549.          GOTO 202
  4550.       RETURN
  4551. '
  4552. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE                *
  4553. '
  4554. 12995 GOSUB 12997                     'KG110506
  4555.        SUBROUTINE.PARAMETER = 1
  4556. 12996 CALL TGET
  4557. 12997 IF SUBROUTINE.PARAMETER < 0 THEN _
  4558.          GOTO 202
  4559.       RETURN
  4560. 12998 A$ = A$ + _
  4561.            PRESS.ENTER$
  4562.       GOTO 12995
  4563. 12999 TURBO.KEY = -TURBO.KEY.USER
  4564.       GOTO 12995
  4565. '
  4566. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE            *
  4567. '
  4568. 13000 IF DEBUG THEN _
  4569.          A$ = "DEBUG Trap ERL=" + _
  4570.               STR$(EL) + _
  4571.               " ERR=" + _
  4572.               STR$(EC) : _
  4573.               CALL PRINTIT(A$) : _
  4574.               D$ = A$ : _
  4575.               GOSUB 1315
  4576.       IF EL = 1905 AND EC = 63 THEN _
  4577.          CLOSE 1 : _
  4578.          KILL ACTIVE.MESSAGE.FILE$ : _
  4579.          GOTO 5350
  4580.       IF EL = 4371 AND EC = 6 THEN _
  4581.          GOTO 1200
  4582.       IF EL =  4740 THEN _
  4583.          GOTO 4745
  4584.       IF EL =  5151 AND EC = 62 THEN _
  4585.          CALL UPDTCALR (PASSWORDS.FILE$ + " bad format!",2) : _
  4586.          GOTO 5160
  4587. 13500 CALL LOGERROR
  4588.       CALL QTPUT (CALLERS.RECORD$,1)
  4589.       GOTO 1200
  4590. '
  4591. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")   *
  4592. '
  4593. 13538 CALL UPDTCALR ("No calls.  Recycling.",1)
  4594.       GOTO 13549
  4595. 13540 IF LOCAL.USER THEN _
  4596.          IF NOT LOCAL.USER.MODE THEN _
  4597.             GOTO 13549
  4598. 13543 IF (NOT SYSOP) THEN _
  4599.          IF ((USER.FILE.INDEX = 0 AND REMEMBER.NEW.USERS) OR _
  4600.             NEW.USER = TRUE) THEN _
  4601.             GOTO 13549
  4602. 13545 IF NOT BACK.FROM.DOOR THEN CALL UPDATEC            'KP101102
  4603. 13549 GOSUB 13700
  4604.       IF LOCAL.USER OR _
  4605.          MODEM.OFFHOOK THEN _
  4606.          GOTO 13555
  4607.       IF NOT FOSSIL THEN _
  4608.          OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) AND 254 : _
  4609.          CALL DELAYIT (DTR.DROP.DELAY) : _
  4610.          OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1 : _
  4611.          GOTO 13553
  4612. 13550 CALL FOSSTATUS(COMPORT%,STATUS%)
  4613.       STATUS% = STATUS% AND &H4000
  4614.       IF STATUS% <> &H4000 THEN _
  4615.          CALL DELAYIT (8 + BPS)
  4616.       STATE%=0
  4617.       CALL FOSDTR(COMPORT%,STATE%)
  4618.       CALL DELAYIT (DTR.DROP.DELAY)
  4619.       STATE%=1
  4620.       CALL FOSDTR(COMPORT%,STATE%)
  4621. 13553 CALL DELAYIT (DTR.DROP.DELAY)
  4622.       CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  4623.       CALL DELAYIT (MODEM.COMMAND.DELAY.TIME)
  4624. 13555 ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$
  4625.       GOSUB 12986
  4626.       GOSUB 5344                   ' problem spot for doors
  4627.       GET 1,NODE.RECORD.INDEX
  4628.       EXIT.TO.DOORS = FALSE
  4629.       MID$(MESSAGE.RECORD$,57,1) = "I"
  4630.       MID$(MESSAGE.RECORD$,40,2) = STR$(EXIT.TO.DOORS)
  4631.       PUT 1,NODE.RECORD.INDEX
  4632.       GOSUB 12985
  4633.       CLOSE 1,2,4,5
  4634.       IF NOT FOSSIL THEN _
  4635.          CLOSE 3
  4636.       IF RECYCLE.TO.DOS THEN _
  4637.       GOTO 203
  4638.       RUN 100
  4639. 13600 CLS
  4640.       LOCATE ,,0
  4641.       D$ = DF$ + _
  4642.            " file not found/invalid.  Run CONFIG."
  4643.       GOSUB 1315
  4644.       CALL DELAYIT (3)
  4645.       GOTO 203
  4646. 13700 IF MESSAGE.FILE.LOCK THEN _
  4647.          GOSUB 12987
  4648. 13710 IF USER.FILE.LOCK THEN _
  4649.          GOSUB 12990
  4650. 13720 IF USER.BLOCK.LOCK THEN _
  4651.          GOSUB 12991
  4652.       RETURN
  4653. '
  4654. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)*
  4655. '
  4656. 20093 IF USER.FILE.INDEX > 0 THEN _
  4657.          CALL OPENUSER (HIGHEST.USER.RECORD) : _
  4658.          GET 5,USER.FILE.INDEX : _
  4659.          GOSUB 9500
  4660. 20095 RETURN 1200
  4661. '
  4662. ' *  V - COMMAND FROM FILES MENU (VIEW ARC CONTENTS)                          *
  4663. '
  4664. 20140 CALL GETARC
  4665.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4666.          GOTO 13540
  4667.       IF DENY.ACCESS THEN _
  4668.          GOTO 1386
  4669.       RETURN
  4670. '
  4671. ' * GO TO THE FILE SYSTEM TO LIST THE SYSOP'S COMMENTS
  4672. '
  4673. 20150 FILESYS.PARAMETER = 1
  4674.       GOTO 20200
  4675. '
  4676. ' * GO TO THE FILE SYSTEM TO LIST THE FILE DIRECTORIES
  4677. '
  4678. 20155 FILESYS.PARAMETER = 2
  4679.       GOTO 20200
  4680. '
  4681. ' * GO TO THE FILE SYSTEM TO DOWNLOAD FILES
  4682. '
  4683. 20160 FILESYS.PARAMETER = 3
  4684.       GOTO 20200
  4685. '
  4686. ' * GO TO THE FILE SYSTEM WHEN RETURNING FROM EXTERNAL PROTOCOLS
  4687. '
  4688. 20165 FILESYS.PARAMETER = 4
  4689.       GOTO 20200
  4690. '
  4691. ' * GO TO THE FILE SYSTEM TO UPLOAD FILES
  4692. '
  4693. 20170 FILESYS.PARAMETER = 5
  4694.       GOTO 20200
  4695. '
  4696. ' * GO TO THE FILE SYSTEM TO SCAN FILE SYSTEM DIRECTORIES
  4697. '
  4698. 20175 FILESYS.PARAMETER = 6
  4699.       GOTO 20200
  4700. '
  4701. ' * GO TO THE FILE SYSTEM TO HANDLE "PERSONAL" FILES
  4702. '
  4703. 20180 FILESYS.PARAMETER = 7
  4704.       GOTO 20200
  4705. '
  4706. ' * GO TO THE FILE SYSTEM TO LIST "NEW" FILES
  4707. '
  4708. 20185 FILESYS.PARAMETER = 8
  4709.       GOTO 20200
  4710. '
  4711. ' * RETURN TO THE FILE SYSTEM AFTER HANDLING EXTENDED FILE DESCRIPTIONS
  4712. '
  4713. 20190 FILESYS.PARAMETER = 9
  4714. 20200 CALL FILESYS
  4715.  IF DOWNLOAD.COMPLETED AND AUTO.END = 1 THEN_
  4716.                          GOTO 20235                   'AUTO Loggoff Mod
  4717.       ON FILESYS.PARAMETER GOTO 20205, _
  4718.                                 20210, _
  4719.                                 20215, _
  4720.                                 20220, _
  4721.                                 20225, _
  4722.                                 20230, _
  4723.                                 20235
  4724. 20205 RETURN
  4725. 20210 RETURN 202
  4726. 20215 RETURN 1200
  4727. 20220 RETURN 1380
  4728. 20225 SYSOP.COMMENT = TRUE
  4729.       MAX.MESSAGE.LINES = MAX.EXTENDED.LINES
  4730.       GOSUB 2008
  4731.       GOTO 20190
  4732. 20230 RETURN 10553
  4733. 20235 RETURN 10595
  4734. '
  4735. ' *  GET MESSAGE HEADER RECORD DATA
  4736. '
  4737. 23000 HIGHEST.MESSAGE.RECORD = LOF(1)/128                            ' JM110803
  4738.       GET 1,HIGHEST.MESSAGE.RECORD                                   ' JM110803
  4739.       GET 1,1
  4740.       HIGH.MESSAGE.NUMBER = VAL(LEFT$(MESSAGE.RECORD$,8))
  4741.       AUTO.ADD.SECURITY   = CVI(MID$(MESSAGE.RECORD$,9,2))
  4742.       CALLS.TODATE! = VAL(MID$(MESSAGE.RECORD$,11,10))
  4743.       CURRENT.USER.COUNT = VAL(MID$(MESSAGE.RECORD$,57,5))
  4744.       FIRST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,68,7))
  4745.       NEXT.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,75,7))
  4746.       HIGHEST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,82,7))
  4747.       IF ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$ THEN _
  4748.          NODES.IN.SYSTEM = VAL(MID$(MESSAGE.RECORD$,127))
  4749.       RETURN
  4750. '
  4751. ' *  UPDATE MESSAGE HEADER RECORD DATA                                        *
  4752. '
  4753. 24000 MID$(MESSAGE.RECORD$,1,8) = STR$(HIGH.MESSAGE.NUMBER)
  4754.       MID$(MESSAGE.RECORD$,11,10) = STR$(CALLS.TODATE!)
  4755.       MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)
  4756. '     MID$(MESSAGE.RECORD$,62,5) = STR$(HIGHEST.USER.RECORD)
  4757.       MID$(MESSAGE.RECORD$,68,7) = STR$(FIRST.MESSAGE.RECORD)
  4758.       MID$(MESSAGE.RECORD$,75,7) = STR$(NEXT.MESSAGE.RECORD)
  4759.       MID$(MESSAGE.RECORD$,82,7) = STR$(HIGHEST.MESSAGE.RECORD)
  4760.       PUT 1,1
  4761.       RETURN
  4762. '
  4763. ' * A - COMMAND FROM LIBRARY MENU (ARCHIVE A SELECTED LIBRARY DISK)           *
  4764. '
  4765. 30000 SUBROUTINE.PARAMETER = 4
  4766.       CALL LIBRARY
  4767.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4768.          RETURN 10595
  4769.       RETURN
  4770. '
  4771. ' * C - COMMAND FROM LIBRARY MENU (CHANGE TO A LIBRARY DISK)                  *
  4772. '
  4773. 30100 SUBROUTINE.PARAMETER = 2
  4774.       CALL LIBRARY
  4775.       RETURN
  4776. '
  4777. ' * D - COMMAND FROM LIBRARY MENU (DOWNLOAD F DISK/FILE FROM LIBRARY)         *
  4778. '
  4779. 30200 IF TIME.LOCK AND 2 THEN _
  4780.          CALL TIMELOCK : _
  4781.          IF NOT OK THEN _
  4782.             RETURN
  4783.       IF LIBRARY.DISK.CHAR$ = "0000" THEN _
  4784.          CALL QTPUT ("You must select a Library disk first!",1) : _
  4785.          RETURN
  4786.      SUBROUTINE.PARAMETER = 3
  4787.      CALL LIBRARY
  4788.      GOTO 20160
  4789. '
  4790. ' * CALCULATE TIME REMAINING FOR USER                                         *
  4791. '
  4792. 41000 CALL CHKTREMAIN (TIME.REMAINING!)
  4793.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4794.          RETURN 10553
  4795.       RETURN
  4796. '
  4797. ' * SHOW USER CURRENT ACCESS LEVEL                                            *
  4798. '
  4799. 41070 A$ = "Granted access level" + _
  4800.            STR$(USER.SECURITY.LEVEL) + _
  4801.            MID$(" (SYSOP)",1,-8 * (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL))
  4802.       GOSUB 12975
  4803.       RETURN
  4804. '
  4805. ' * NULLS SET FOR NEW USERS                                                   *
  4806. '
  4807. 42700 CALL SKIPLINE (1)
  4808.       CALL QTPUT ("TurboKey: act on 1 character command without waiting for [ENTER]",1)
  4809.       A$ = "Want TurboKeys (Y/[N])"
  4810.       GOSUB 12999
  4811.       TURBO.KEY.USER = NOT YES
  4812.       CALL TOGGLE (8)
  4813.       RETURN
  4814. '
  4815. ' *  F - COMMAND FROM UTILITY MENU (FILE TRANSFER DEFALUT MODE)               *
  4816. ' *  FILE TRANSFER DEFAULT SET FOR NEW USERS                                  *
  4817. '
  4818. 42800 FF = INSTR(DFLTXFER$,USER.TRANSFER.DEFAULT$)
  4819.       IF FF = 0 THEN _
  4820.          FF = INSTR(INTERNAL.EQUIV$,"N")
  4821.       CALL QTPUT ("Current Protocol: "+MID$(DFLTXFER$,FF,1),1)
  4822. 42805 A$ = "Default "
  4823.       CALL XFERTYPE (1,EXPERT.USER)
  4824.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4825.          RETURN 10595
  4826.       USER.TRANSFER.DEFAULT$ = FT$
  4827. 42810 A$ = "PROTOCOL: " + PROTO.PROMPT$
  4828.       GOSUB 12979
  4829.       RETURN
  4830. '
  4831. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE TOGGLE)                       *
  4832. ' *  UPPER/LOWER CASE SET FOR NEW USERS                                       *
  4833. '
  4834. 42850 IF Q > 1 THEN _
  4835.          X = 2 : _
  4836.          GOTO 42852
  4837.       GOSUB 9525
  4838. 42851 X = 1
  4839.       A$ = "Change to R)BBS, C)aller's software" + _
  4840.            MID$(", I)ntermediate host",1,-20 * (HOST.ECHO.ON$ <> "")) + _
  4841.            PRESS.ENTER.EXPERT$
  4842.       GOSUB 12999
  4843.       IF Q = 0 THEN _
  4844.          RETURN
  4845. 42852 Z$ = LEFT$(B$(X),1)
  4846.       CALL ALLCAPS (Z$)
  4847.       IF INSTR("ICR",Z$) = 0 THEN _
  4848.          GOTO 42851
  4849.       ECHOER$ = Z$
  4850.       CALL SETECHO (ECHOER$)
  4851.       GOSUB 9525
  4852.       RETURN
  4853. 42950 A$ = "CAN YOUR TERMINAL DISPLAY LOWER CASE ([Y]/N)"
  4854.       GOSUB 12995
  4855.       UPPER.CASE = NOT NO
  4856.       CALL TOGGLE(3)
  4857.       RETURN
  4858. '
  4859. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)                          *
  4860. ' *  GRAPHIC MENUS SELECTION SET FOR NEW USERS                                *
  4861. '
  4862. 43000 GOSUB 43005
  4863.       GOTO 43022
  4864. 43005 CALL ASKGRAPH (USER.GRAPHIC.DEFAULT$)
  4865.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4866.          RETURN 10595
  4867.       IF Q = 0 THEN _
  4868.          RETURN
  4869. 43020 A$ = "Text GRAPHICS: " + _
  4870.            MID$("None AsciiColor",GR * 5 + 1,5)
  4871.       GOSUB 12979
  4872.       RETURN
  4873. 43022 IF EMPHASIZE.ON.DEF$ = "" THEN _
  4874.          RETURN
  4875.       A$ = "Do you want COLORIZED prompts ([Y],N)"
  4876.       GOSUB 12999
  4877.       HIGHLIGHT.OFF = NOT NO
  4878.       CALL TOGGLE(5)
  4879.       RETURN
  4880. 43025 CALL GRAPHIC (USER.GRAPHIC.DEFAULT$)
  4881. '
  4882. ' *  DISPLAY NON-BREAKABLE TEXT FILES 
  4883. '
  4884. 43027 STOP.INTERRUPTS = TRUE
  4885.       CALL BUFFILE (FILE.NAME$,X)
  4886.       CALL CARRIER
  4887.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4888.          RETURN 10595
  4889.       STOP.INTERRUPTS = FALSE
  4890.       RETURN
  4891. '
  4892. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)
  4893. '
  4894. 45010 HIDDEN = TRUE
  4895.       GOSUB 12995
  4896.       HIDDEN = FALSE
  4897.       RETURN
  4898. '***************** AUTOLOGOFF TIMER MOD *****************
  4899. 46000 SUBROUTINE.PARAMETER = 1
  4900.    A$ = "AutoLogOff Counter Active, press [ENTER] to cancle"
  4901.      IF LOCAL.USER THEN _
  4902.         GOTO 46050
  4903.          CALL ABORTLOGOFF
  4904.            IF Q = 0  THEN _
  4905.             CALL QTPUT("Log Off Aborted.......",1) : _
  4906.            AUTO.END = 0 : _
  4907.         RETURN 1205
  4908.       GET.OUT = TRUE
  4909. 46050 RETURN 10597 
  4910.